目录
默认绑定
全局环境中,this默认绑定到全局对象(严格模式:undefined)
在控制台中分别执行以下代码,注意,全局变量相当于window对象的属性
注意:对于默认绑定,决定this绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。
<1> console.log(this==window) // true
<2> var a={
foo:"123",
bar:"456",
that:this
}
a.that // window
<3> this // window
函数独立调用或者被嵌套函数独立调用时,this默认绑定到window
虽然test()函数被嵌套在obj.foo()函数中,但test()函数是独立调用,而不是方法调用。所以this默认绑定到window
var a = 0;
var obj = {
a : 2,
foo:function(){
function test(){
console.log(this.a);
}
test();
}
}
obj.foo();//0
立即执行函数实际上是函数声明后直接调用执行
var a = 0;
function foo(){
(function test(){ console.log(this.a); })()
};
var obj = { a : 2, foo:foo }
obj.foo();//0
闭包中被返回到外部的函数也是独立调用
var a = 0;
function foo(){
var a = 1
function test(){
console.log(this.a);
}
return test;
};
var obj = {
a : 2,
foo:foo
}
obj.foo()();//0
隐式绑定
函数做为对象方法调用时(即方法调用),this隐式绑定到该直接对象
function foo(){
console.log(this.a);
};
var obj1 = {
a:1,
foo:foo,
obj2:{
a:2,
foo:foo
}
}
//foo()函数的直接对象是obj1,this隐式绑定到obj1
obj1.foo();//1
//foo()函数的直接对象是obj2,this隐式绑定到obj2
obj1.obj2.foo();//2
隐式丢失
隐式丢失是指被隐式绑定的函数丢失绑定对象,从而默认绑定到window,有以下几种情况会造成隐式丢失
<1>函数别名
var a = 0;
function foo(){
console.log(this.a);
};
var obj = {
a :