我们都知道,调用一个函数一共有四种调用模式:
-
方法调用模式
- 定义:当一个函数被保存为对象的一个属性的时候,这个函数被称为方法。
- 此时的this:当一个方法被调用的时候,this绑定到该对象上。
-
举例子:
var obj = {
name:"harrisking",
foo: function(){
console.log(this.name);//harrisking
//这里的this指的就是obj;
}
}
-
函数调用模式
- 定义:当一个函数并非一个对象的属性时,则这个函数就是一个函数来调用的。
- 此时的this:以此模式调用函数时,this被绑定到全局对象(window)。
-
举例子:
var a = function(){
console.log(this.b())
}
var b = function(){
console.log("马达,又躺枪!")
}
a();//"马达,又躺枪!"
构造器调用模式
-
定义:如果一个函数前面带上一个new来调用,则该函数就是作为构造函数来调用的。
- 这里要补充一个重要的知识点——new到底做了些啥?
当一个构造函数前加上new的时候,背地里来做了四件事:
1,生成一个空的对象并将其作为 this;
2,将空对象的proto 指向构造函数;
3,运行该构造函数;
4,如果构造函数没有 return 或者 return 一个返回 this 值是基本类型,则返回
this;如果 return 一个引用类型,则返回这个引用类型。
- 这里要补充一个重要的知识点——new到底做了些啥?
此时的this:这时候,this被绑定到了新构造的对象上。
举例子:
var People = function(name,age){
this.name = name;
this.age = age;
};
var p1 = new People('harrisking',23);
p1.name;//harrisking;apply调用模式
定义:apply和call的方法很像,它拥有两个参数:一个是预设定的this,一个是要传递的参数(apply传递的是数组)。
分割线
敬爱的方方老师推荐的方法是:
将上述四种调用方式还原为call/apply形式。
则:
- 方法调用模式:
obj.foo( ) ==> obj.foo.call('obj');则this就是obj; - 函数调用模式:
a() ==> window.a.call() ==> 因为call未指定this的值,则这里的this代表window;
最后特此感谢方方老师的原文 this的值到底是什么