关于函数上下文对象(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]