为什么我的setTimeout函数返回“window”而不是我的对象的name属性?

时间:2011-03-31 09:02:35

标签: javascript

function Person(name) {
this.name = name;
}

Person.prototype.showName = function() {
alert(this.name);
}


var mike = new Person("mike");
mike.showName();  


window.name = "window"; 
setTimeout(mike.showName, 5000);  

何时

setTimeout(mike.showName, 5000)
执行

,为什么结果是“窗口”?感谢。

3 个答案:

答案 0 :(得分:5)

保罗 因为setTimeout在窗口范围内运行。该方法也可以通过window.setTimeout()调用。因此,当调用mike.showName时,这将引用窗口对象,而不是Person对象。

您可以使用包装函数来解决此问题:

  window.setTimeout(function()
  {
  mike.showName();
  }, 5000);

另请阅读:http://www.quirksmode.org/js/this.html

答案 1 :(得分:1)

您需要将范围捕获到匿名函数中,或者setTimeout将在窗口范围内运行:

setTimeout(function() { mike.showName() }, 5000);  

答案 2 :(得分:1)

setTimeout()执行的代码在一个单独的执行上下文中运行,该函数从中调用它。因此,被调用函数的this关键字将被设置为窗口(或全局)对象,它将与调用setTimeout的函数的this值不同。 JavaScript参考中更详细地解释了此问题。

改为使用setTimeout('mike.showName()', 5000);