嵌套方法调用附加到DOMWindow的实例而不是self

时间:2012-07-13 20:42:13

标签: javascript jquery prototypejs

someSingleton = (function() {    
    var someFunction = function() {
        console.log(this);
        someOtherFunc();
    };

    var someOtherFunc = function() {
        console.log(this);
    };

    return {
        method: someFunction
    }
})();

someSingleton.method();

如果运行这个你会注意到第一个方法将按预期返回对象,第二个嵌套方法调用someOtherFunction将返回DOMWindow对象。

除了将实例(this)作为参数传递给第二个方法之外,我该如何使第二个方法调用引用包含对象而不是DOMWindow。

4 个答案:

答案 0 :(得分:1)

someOtherFunc.call(this);

它仅取决于函数的调用方式,而不取决于函数的定义位置。

答案 1 :(得分:0)

您可以使用call方法 [MDN] 明确指定函数的调用上下文:

var someFunction = function() {
    console.log(this);
    someOtherFunc.call(this);
};

thiswindow的错误绑定是一个常见的JavaScript错误。

答案 2 :(得分:0)

了解javascript中的this可能是一个挑战。我可以推荐 阅读Douglas Crockford's Javascript: The Good Parts以便更好地理解。同时,您可以查看此链接:) http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

将父对象分配给变量that是很常见的。这样,您可以通过它访问它的属性和功能:

(function(){
  var that = this;
  that.someFunc = function(){};
  that.someOtherFunc = function(){
    console.log(that);
  };
})();

答案 3 :(得分:0)

一种常见的方法是使用bind函数来存储方法的上下文。一个简单的例子可能看起来像这样:

someSingleton = (function() {   

    var singleton = {};

    var _bind = function (func, me) {
        return function () {
            func.apply(me, arguments);   
        }
    }

    var someFunction = _bind(function() {
        console.log(this);
        someOtherFunc();
    }, singleton);

    var someOtherFunc = _bind(function() {
        console.log(this);
    }, singleton);

    singleton.method = someFunction;

    return singleton;
})();

someSingleton.method();​