如何正确限定此"public"方法的范围?



我有这个代码(JSFiddle)

var OBJ = function(){
    var privateVar = 23;
    var self = this;
    return {
        thePrivateVar : function() {
          return privateVar;
        },  
        thePrivateVarTimeout : function() {
            setTimeout(function() { alert(self.thePrivateVar()); } , 10);
        }
    }
}();
alert(OBJ.thePrivateVar());
OBJ.thePrivateVarTimeout();

这是我遇到的一个实际问题的抽象。

所以-我希望对OBJ.thePrivateVarTimeout()的调用等待10,然后等待alert与23(我希望它通过另一个暴露的方法访问)。

然而,self似乎没有正确设置。当我设置self = this时,似乎this不是对函数的引用,而是对全局对象的引用。为什么会这样?

如何使公共方法thePrivateVarTimeout调用另一个公共方法thePrivateVar ?

var OBJ = (function(){
    var privateVar = 23;
    var self = {
        thePrivateVar : function() {
          return privateVar;
        },  
        thePrivateVarTimeout : function() {
            setTimeout(function() { alert(self.thePrivateVar); } , 10);
        }
    };
    return self;
}());

this === global || undefined在被调用的函数中。在ES5中,它是全局环境,在ES5中,它是未定义的。

更常见的模式包括使用var that = this作为函数

中的局部值。
var obj = (function() {
  var obj = {
    property: "foobar",
    timeout: function _timeout() {
      var that = this;
      setTimeout(alertData, 10);
      function alertData() {
        alert(that.property);
      }
    }
  }
  return obj;
}());

或使用.bindAll方法

var obj = (function() {
  var obj = {
    alertData: function _alertData() {
      alert(this.property);
    }
    property: "foobar",
    timeout: function _timeout() {
      setTimeout(this.alertData, 10);
    }
  }
  bindAll(obj)
  return obj;
}());

/*
    bindAll binds all methods to have their context set to the object
    @param Object obj - the object to bind methods on
    @param Array methods - optional whitelist of methods to bind
    @return Object - the bound object
*/
function bindAll(obj, whitelist) {
    var keys = Object.keys(obj).filter(stripNonMethods);
    (whitelist || keys).forEach(bindMethod);
    function stripNonMethods(name) {
        return typeof obj[name] === "function";
    }
    function bindMethod(name) {
        obj[name] = obj[name].bind(obj);
    }
    return obj;
}

相关内容

  • 没有找到相关文章

最新更新