使用Javascript调用对象中的函数

Dan*_*ark 0 javascript oop

我有一个像这样定义的对象:

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问题.

nem*_*isj 6

要解决此问题,您可以在构建超时时使用匿名函数和作用域引用.

(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会将毫秒传递给你的函数,所以它可能会导致意外错误.