我有一个像这样定义的对象:
Blah = {
hideTimer:null,
setTimer: function() {
this.hideTimer = window.setTimeout(Blah.hidePopupInner, 500);
// must be done via window due to Greasemonkey
},
hidePopupInner: function() {
log("This? " + this);
},
hidePopupInnerPublic: function() {
Blah.hidePopupInner();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是killTimer中的'this' 没有设置为Blah.如果我改变行说
this.hideTimer = window.setTimeout(Blah.hidePopupInnerPublic, 500);
Run Code Online (Sandbox Code Playgroud)
然后'this'指向Blah,因此可以使用hideTimer.
为每种方法制定一个"公共"方法可以解决问题,但必须有一个更简单的解决方案......?
注意:这一切都在Greasemonkey中,但我认为这是一个普遍的Javascript问题.
要解决此问题,您可以在构建超时时使用匿名函数和作用域引用.
(code...)
setTimer: function() {
var _this = this;
this.hideTimer = window.setTimeout(function(ms){
_this.hidePopupInner();
}, 500);
},
(code...)
Run Code Online (Sandbox Code Playgroud)
PS:此外,setTimeout将传递毫秒数到调用函数.例如:假设你的函数可以接收一个参数,并用它做一些事情.但是因为setTimeout会将毫秒传递给你的函数,所以它可能会导致意外错误.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |