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

Javascript 匿名函数中有哪些变量可用?,javascript,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 } 在匿名函数内部,作

关于范围,有一点我一直感到困惑:

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”不起作用呢?

问题是
setTimeout
是用
窗口
作为作用域调用的

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

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

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

问题是调用
setTimeout
时使用
window
作为作用域

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

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

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

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

例如,在超时函数中运行
console.log(this)
,返回如下结果:

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

当您使用
var t=this
时,您将引用指定给当前对象,这是有效的

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

例如,在超时函数中运行
console.log(this)
,返回如下结果:

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

当您使用
var t=this
时,您将引用指定给当前对象,这是有效的

这个
一开始就没有定义。@LutzHorn我想我们看到的代码是嵌入在一个地方的,
这个
是以一种有用的方式定义的。
这个
是可用的,一如既往,只是它的含义已经改变。
这个
是动态范围的,而不是像其他任何东西一样在词汇范围内。如果您需要
this.init
中的
this
,请将其存储在该函数中的另一个变量中,就像您对
t
所做的那样
首先,这个
是没有定义的。@LutzHorn我想我们看到的代码是嵌入在一个位置的,
这个
是以一种有用的方式定义的。
这个
是可用的,和往常一样,只是它的含义发生了变化。
这个
是动态范围,而不是像其他任何东西一样在词汇范围内。如果需要来自
this.init
this
,请将其存储在该函数内的另一个变量中,就像使用
t
一样。