this一般只有在被调用的时候才会进行绑定,并不是在声明时绑定,this的指向与声明位置无关,至于调用或者执行时有关。
默认绑定
function foo(){
console.log(this.a);
}
var a=2;
foo();//2
foo()函数直接调用不带任何修饰的引用一般都为默认绑定,而this一般默认指向window。
严格模式下,则为undefined。
隐式绑定
function foo(){
console.log(this.a);
}
var obj={
a:3,
foo:foo,
}
var a=2;
obj.foo(); //3
obj.foo()因为是obj调用的foo函数,所以这时this绑定了obj,this.a也当然是指obj对象里的a。所以结果为3。
隐式绑定会出现一个问题———隐式丢失
function foo(){
console.log(this.a);
}
var obj={
a:3,
foo:foo,
}
var a=2;
var bar = obj.foo;
bar();//2
bar是obj.foo函数的一个引用,引用的本身是obj.foo,不是foo()函数,所以this采取默认绑定,指向window,所以值为2;
显式绑定
使用call()和apply()方法,这两种方法的第一个参数为一个对象,this会自动绑定到该对象上。
function foo(){
console.log(this.a);
}
var obj={
a:3,
foo:foo,
}
var a=2;
foo.call(obj);
此例子用了call()方法,传入参数obj,this则被强制绑定到obj上,所以结果为3.
call()和apply()方法的区别:
apply()接收两个参数,第一个为this的绑定对象,第二个则为数组实例或者arguments对象。
call()方法第一个参数是this绑定的对象,其余参数必须直接传给函数
new绑定
1、构建新对象
2、改变this指向,使this指向当前新对象
3、给新对象添加属性
4、返回新对象