2011-11-19 5 views
7

コールバックとして関数に渡したいメソッドを持つオブジェクトがあります。しかし、コールバックの内部では、thisはもはや自分のオブジェクトを参照しません。何故なの?メンバー関数コールバックでオブジェクトを取得する

私は、関数リテラルを渡すときに問題を回避するために変数を使用して精通よ:

var obj = { 
    a: function() { 
     var me = this; 

     console.log(this); 

     setTimeout(function() { 
      console.log(this); // Not obj 
      console.log(me); // This works! 
     }, 100); 
    } 
}; 

私はこのケースでは、それを解決することができますか?

var obj = { 
    b: function() { 
     setTimeout(this.callback, 100); 
    }, 
    callback: function() { 
     console.log(this); // =(
    } 
}; 

答えて

9

はい、thisはJavascriptで扱いにくいことがあります。問題は、その値がhow you call the functionに依存していることです。

obj.callback(); //ok 

var f = obj.callback; 
f(); //does not look like a method call 
    //Javascript does not pass the this! 

あなたはBで行ったように、通常の回避策は、(あなたが時々あまりにもself

var that = this; 
setTimeout(function(){ return that.callback(); }, 300); 

他の代替を参照してくださいme変数の共通名がthatであることを除いて、)ラッパーコールバックを渡しています関数からそのバインドはIE 8でサポートされていない

setTimeout(this.callback.bind(this) , 300) 

注意をbindメソッドを使用することです(あなたがでシムが必要になる場合がありますその場合)。より多くの場合


:Function.prototype.bindはECMAScript5の一部である

Maintaining the reference to "this" in Javascript when using callbacks and closures

+1

ノートは、それはそれとして自動IE6/7/8、Firefoxの3.6(およびにはあまり関連が動作しません。 -updates、古いChromes <6) – gonchuki

+0

変数/プロパティを関数自体ではなく関数へのポインタと考えるとき、 'this'を理解する方が簡単です。 'obj.callback'は、それを指している人が何も知らない関数へのポインタにすぎず、実際にポインタをいくつでも持つことができます。このため、関数の 'this'は呼び出し時にしか解決できず、いくつかの簡単な規則があります。だからいつもそれはコール時に解決されていると覚えている人生は簡単になります:) – Esailija

+0

ありがとう@エジハイヤ –

関連する問題