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
一样。