1

次の例では、メソッド「lostThis」オブジェクト「instObj」にパラメータとして送信するために、「this」はウィンドウオブジェクトです。

var obj = function() {};
obj.prototype.lostThis = function() {
    console.log('lostThis', this instanceof obj, this);
};

var instObj = new obj;

var caller = {
    runFn: function(fn) {
        fn();
    }
};

caller.runFn(instObj.lostThis);

コンソールの応答:

lostThis false Window

実行例

次の例(もう少し複雑)では、「instObj」のメソッドを呼び出す方法がいくつかあり、同じ場合と「this」オブジェクトを保持できる場合があります。

var obj = function() {};

obj.prototype.methodRefHasThis = function() {
    var t = this;
    return function() {
        console.log('methodRefHasThis ', t instanceof obj, t);
    };
};

obj.prototype.methodRefLostThis = function() {
    console.log('methodRefLostThis ', this instanceof obj, this);
};

obj.prototype.methodRefMaybeThis = function() {
    console.log('methodRefMaybeThis ', this instanceof obj, this);
};

var instObj = new obj;
var caller = {
    runFn: function(fn) {
        fn();
    }
};

// width jQuery
$('button')
    .bind('click', instObj.methodRefHasThis())
    .bind('click', instObj.methodRefLostThis);

caller.runFn(instObj.methodRefHasThis());
caller.runFn(instObj.methodRefLostThis);
caller.runFn(function() {
    instObj.methodRefMaybeThis();
});​

コンソールの応答:

methodRefHasThis  true obj
methodRefLostThis  false Window
methodRefMaybeThis  true obj

methodRefHasThis  true obj
methodRefLostThis  false <button>​press here​&lt;/button>​

実行例

これは、メソッドをイベントに割り当てるjQueryで発生することを理解していますが、メソッド「methodRefLostThis」を呼び出して、参照によって渡される「this」オブジェクトを失うことはありませんか?

ありがとう

@ am_not_i_am、@ Dan_Davies_Brackett、@Ben_Leeによる解決策

var obj = function() {};
obj.prototype.lostThis = function() {
    console.log('lostThis', this instanceof obj, this);
};

var instObj = new obj;

var caller = {
    runFn: function(fn) {
        fn();
    }
};

caller.runFn(instObj.lostThis.bind(instObj));
caller.runFn($.proxy(instObj.lostThis, instObj));

コンソールの応答:

lostThis true obj
lostThis true obj

 ​

実行例

4

3 に答える 3

2

bindを使用して、呼び出し先のオブジェクトをバインドできますthis。例えば:

caller.runFn(instObj.lostThis.bind(this));

ここで、thisメソッドが実行された時点で、inに転送さthislostThisます。

于 2012-06-13T19:46:22.197 に答える
2

この問題を解決するには2つの方法があります。this(私は通常それを呼び出しますself)へのローカル参照をキャプチャしてから、メソッド内のself.代わりに使用するか、関数バインディングを使用することができます。this.

ベン・リーは、JS5にバインディングを行う方法を提供しました。jQuery.proxy は、をサポートしていないブラウザの代替手段ですFunction.bind

于 2012-06-13T19:48:20.943 に答える
0

動作することがわかった手法の1つを使用したくない場合はFunction.prototype.bind、呼び出し元のコンテキストを新しい関数にバインドするために使用できます...

caller.runFn(instObj.lostThis.bind(instObj));

これにより、呼び出されたときに、最初の引数として渡したものに呼び出しコンテキストが設定される新しい関数が返されます.bind()

に渡される追加の引数は.bind()、返された関数への固定引数として設定されます。

于 2012-06-13T19:46:31.950 に答える