匿名函数中有哪些变量可用?

时间:2013-12-05 14:40:10

标签: javascript

有一些关于范围的事情,我一直对此感到困惑:

this.init = function(){
  var t = this;
  setTimeout(function(){
    // why is t still available here?
    t.initgame();
    // but not this?
    this.initgame();
  }, 500);
}

this.initgame = function() {
  // yada yada
}

我在匿名函数中得到它,范围不同于它​​。 但是,在上面的例子中,为什么在超时函数中可以使用变量“t”,而“this”不起作用?

2 个答案:

答案 0 :(得分:3)

问题是调用setTimeoutwindow作为范围。

使用专用变量来存储thist)是一种非常有效且通常的解决方案。

在现代浏览器中,bind有时很方便:

setTimeout((function(){
    // use this
}).bind(this), 500);

答案 1 :(得分:2)

当匿名函数运行时,它不再作为init的成员函数运行,而是作为window的顶级函数运行。因此,this.initgame()没有任何意义。

例如,在timeout函数内运行console.log(this)返回如下:

Window {top: Window, window: Window, location: Location, external:...

当您使用var t = this时,您可以分配对当前对象的引用。