var a=0;
var obj = {
a:'obj',
b:function(a){
console.log(this.a);
}
}
obj.b(1);//obj (1)
obj.b.call(this,1);//0 (2)
obj.b.apply([1]);//undefined (3)
====================================================
var a=0;
var obj = {
a:'obj',
b:function(a){
setTimeout(function(){
console.log(this.a);
},1000)
}
}
obj.b(1);//0 (4)
obj.b.call(this,1);//0 (5)
obj.b.call(1);//0 (7)
obj.b.apply([1]);//0 (8)
obj.b.apply(null,[1]);//0 (9)
obj.b.apply(this,[1]);//0 (10)
问题一:比较(1)和(4),setTimeout所起的作用是什么呢?
问题二:比较(3)和(8),为何(8)中就有值,而(3)没有?
问题三:为何传入值没有任何作用?
超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined.
问题一二三都是一个解释:setTimeout是全局作用域中执行的,所以
this.a
指向全局变量var a = 0;