1.先说结论:setTimeout中所执行函数中的this,永远指向window!!注意是要延迟执行的函数中的this哦!!
- 直接使用
setTimeout("alert(this)", 1);// [object Window]
- 在一个对象中调用setTimeout试试
var obj = {say: function(){
setTimeout("alert('in obj ' + this)", 0)
}
}
obj.say();// in obj [object Window]
- 将执行的代码换成匿名函数试试
var obj = {
say: function(){
setTimeout(function(){alert(this)},0)
}
}
obj.say();// [object Window]
- 换成函数引用再试试
function talk() {
alert(this);
}
var obj = {
say:function() {
setTimeout(talk, 0)
}
}
obj.say();// [object Window]
恩,貌似得到的结论是正确的,setTimeout中的延迟执行函数中的this指向了window。这里我反复的强调,是延迟执行函数中的this,是因为,我们经常会面对两个this。一个是setTimeout调用环境中的this,一个就是延迟执行函数中的this。这两个this有时候是不同的。有些不放心??再多写一些代码测试一下!
var value=33;
function Foo() {
this.value = 42;
setTimeout(function(){
alert(this);
alert(this.value)
}, 500);
// 先后输出 window 33 这里是第二个this
}
new Foo();
再看一段更清晰的代码:
var value=33;
function Foo() {
var value = 42;
setTimeout(function(){
alert(value);
alert(this.value)}, 500);
// 先后输出 42 然后输出33,这里的this是第二个this
}
new Foo();
最后,如果您到看懂了上面的例子,那么我们可以回顾一下得出的一些结论咯:
- setTimeout中的延迟执行代码中的this永远都指向window
- setTimeout(this.method, time)这种形式中的this,即上文中提到的第一个this,是根据上下文来判断的,默认为全局作用域,但不一定总是处于全局下,具体问题具体分析。
- setTimeout(匿名函数, time)这种形式下,匿名函数中的变量也需要根据上下文来判断,具体问题具体分析。