有一些关于范围的事情,我一直对此感到困惑:
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”不起作用?
答案 0 :(得分:3)
问题是调用setTimeout
时window
作为范围。
使用专用变量来存储this
(t
)是一种非常有效且通常的解决方案。
在现代浏览器中,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
时,您可以分配对当前对象的引用。