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)没有?
问题三:为何传入值没有任何作用?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined.
问题一二三都是一个解释:setTimeout是全局作用域中执行的,所以
this.a指向全局变量var a = 0;setTimeout 函数回调的context(this)默认是window
改成这样:
this的隐式绑定在发生参数传递时会造出绑定丢失,从而应用默认绑定而绑定到全局对象;apply的第一个参数为null或undefined时会自动指向全局对象。