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

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

    return {
        method: someFunction
    }
})();

someSingleton.method();

これを実行すると、最初のメソッドが期待どおりにオブジェクトを返し、2番目のネストされたメソッド呼び出しsomeOtherFunctionがDOMWindowオブジェクトを返すことに気付くでしょう。

インスタンス(this)をパラメーターとして2番目のメソッドに渡す以外に、2番目のメソッド呼び出しがDOMWindowではなく包含オブジェクトを参照するようにするにはどうすればよいですか。

4

4 に答える 4

1

someOtherFunc.call(this);

関数がどこでどのように定義されているかではなく、関数がどのように呼び出されるかにのみ依存します。

于 2012-07-13T20:52:38.197 に答える
0

一般的なアプローチの1つは、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();​
于 2012-07-13T21:01:32.720 に答える
0

callメソッド[MDN]を使用して、関数の呼び出しコンテキストを明示的に指定できます。

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

thistoのバインドの誤りwindowは、JavaScriptの一般的なバグです。

于 2012-07-13T20:54:31.533 に答える
0

javascriptで理解thisするのは難しい場合があります。理解を深めるために、ダグラス・クロックフォードのJavascript:TheGoodPartsを読むことをお勧めします。その間、あなたはこのリンクをチェックすることができます:) http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

親オブジェクトを変数に割り当てることは非常に一般的ですthat。このようにして、それを介してそのプロパティと機能にアクセスできます。

(function(){
  var that = this;
  that.someFunc = function(){};
  that.someOtherFunc = function(){
    console.log(that);
  };
})();
于 2012-07-13T20:57:24.843 に答える