函数(function)知识点整合--2

关于函数上下文对象(this) 的讲解

我们每次调用函数时,解析器都会将一个上下文对象作为隐含的参数传递进函数。使用this来引用上下文对象,根据函数的调用方式不同会执向不同的对象。

1.以函数的形式调用时,this是window

function fun(){
    console.log(this.name);
}
var obj = {
    name:'孙悟空',
    sayName:fun
}
var name = '白骨精';
fun()//以函数的形式调用,this永远是window,返回‘白骨精’

2.以方法的形式调用时,this是调用方法的对象

什么是方法(method)

- 可以将一个函数设置为一个对象的属性,当一个对象的属性是一个函数时,我们称这个函数是该对象的方法。

对象方法的调用方法:

- 对象.方法名();

- 函数名();

function fun(){
    console.log(this.name);
}
var obj = {
    name:'孙悟空',
    sayName:fun//函数作为obj对象的方法(method)
}
obj.sayName()//==fun(),以方法的形式调用,this就是调用方法的那个对象,返回"swk"

3.以构造函数的形式调用时,this是新建的那个对象

什么是构造函数

- 构造函数是专门用来创建对象的函数

- 一个构造函数我们也可以称为一个类

- 通过一个构造函数创建的对象,我们称该对象时这个构造函数的实例

- 通过同一个构造函数创建的对象,我们称为一类对象

- 构造函数就是一个普通的函数,创建方式和普通函数没有区别,只是他的调用方式不同,如果直接调用,它就是一个普通函数。如果使用new来调用,则它就是一个构造函数

//创建一个Person类
function Person(name,age){
    this.name  = name;
    this.age  = age;
    this.sayName = function(){
        alert(this.name);
    }
}
var per = new Person('Alex',99);//以构造函数的形式调用,this是这个新建的实例对象
console.log(per.sayName());//输出Alex

instanceof

-用来检查一个对象是否是一个类的实例

- 语法:对象 instanceof 构造函数

- 如果该对象时构造函数的实例,则返回true,否则返回false。Object是所有对象的祖先,所以任何对象和Object做instanceof都会返回true

//创建一个Person类
function Person(name,age){
    this.name  = name;
    this.age  = age;
    this.sayName = function(){
        alert(this.name);
    }
}
var per = new Person('Alex',99);
console.log(per instanceof Person);//true

4.使用call和apply调用时,this是函数指定的那个对象

- 这两个方法都是函数对象的方法,需要通过函数对象来调用

- 通过两个方法可以直接调用函数,并且可以通过第一个实参来指定函数中this

function fun(){
    alert(this.name);
    
}
var obj2 ={
    name:234;
};

fun.call(obj2)//函数对象是obj2,输出obj2的name属性值
var obj = {
    name: 123,
    sayName: function(){
        alert(this.name)
    }
    
};
var obj2 ={
    name:234
    };

obj.sayName.apply(obj2)//函数对象是谁,this就是谁,输出234,

apply() 和call()的差别:

call是直接传递函数的实参,而apply需要将实参封装到一个数组中传递

function fun(a,b){
    console.log("a="+a);
    console.log("b="+b); 
}

var obj = {
    name: 123,
    sayName: function(){
        alert(this.name)
    }

fun.call(obj,2,3)//传递实参,a =2,b = 3
fun.appl(obj,[2,3])//需要封装实参

 5.在全局作用域中this代表window

function fun(){
    alert(this);
}

fun() //输出[object Window]

上一篇:Spring Boot项目利用MyBatis Generator进行数据层代码自动生成


下一篇:Hive常见语句及函数