this 是在函数执行的过程中自动创建的一个指向一个对象的内部指针。确切的说,this并不是一个对象,而是指向一个已经存在的对象的指针,也可以认为是this就是存储了某个对象的地址。
this的指向不是固定的,会根据调用的不同,而指向不同的地方。
this的绑定可以分为四种:
1.默认绑定
2.隐式绑定
2.new 绑定
3.显示绑定
1、默认绑定
当我们直接调用一个函数的时候,这个函数作用的this就是默认绑定,
默认绑定在window中
注意:在严格模式下("use strict"),默认绑定在undefined
function foo(){
console.log(this);
}
foo(); //直接调用,默认绑定 this 指代window
2、隐式绑定
使用 对象.方法() 这就是隐式绑定
方法中的this绑定在前面的对象中
var p = {
name : "asd",
foo : function(){
console.log(this.name)
}
}
p.foo(); //this 指代的就是p
3.new 绑定
this 指代将来创建的那个对象
function Person(){
this.name = "a";
console.log(this.name);
}
var p = new Person(); //这个时候 Person中的this就是指的p
4.显示绑定
call 、apply 只有这次调用的时候this显示绑定
var p1 = {
name : "李四",
age : 23,
eat : function(){
console.log(this.name)
}
}
var p2 = {
name : "李五",
age : 22
}
p1.eat.call(p2); //this 指代p2
//使用call的时候,第一个参数表示p1中的this的执行,后面的参数为向这个函数传的值。
//注意一点:如果第一个参数是null,则this仍然是默认的指向。
bind 会返回一个新的函数,永远绑定
5.绑定丢失问题
-
回调函数的绑定丢失问题
- 显示 绑定传入undefined和null的时候的问题
this就会变成默认绑定 (window)