setTimeout方法是挂在window对象下的。《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined”。在这里,我们只讨论非严格模式。
setTimeout接受两个参数,第一个是要执行的代码或函数,第二个是延迟的时间。
一、先说结论:setTimeout中所执行函数中的this,永远指向window!!注意是要延迟执行的函数中的this哦!!
1. 直接使用,代码1.1:
setTimeout("alert(this)", 1); // [object Window]
2. 在一个对象中调用setTimeout试试,代码1.2:
var obj = {
say: function() {
setTimeout("alert('in obj ' + this)", 0)
}
}
obj.say(); // in obj [object Window]
3. 将执行的代码换成匿名函数试试,代码1.3:
var obj = {
say: function() {
setTimeout(function(){alert(this)}, 0)
}
}
obj.say(); // [object Window]
4. 换成函数引用再试试吧,代码1.4:
function talk() {
alert(this);
}
var obj = {
say: function() {
setTimeout(talk, 0)
}
}
obj.say(); // [object Window]
恩,貌似得到的结论是正确的,setTimeout中的延迟执行函数中的this指向了window。这里我反复的强调,是延迟执行函数中的this,是因为,我们经常会面对两个this。 一个是setTimeout调用环境中的this,一个就是延迟执行函数中的this 。