2011-10-28 6 views
2

例1これは!=これはJavaScriptで(まあ、時には....)

var Reptile = function() { 
    var reptile = this; 
    this.showBla = function() { 
     alert(reptile.bla); 
    } 
} 

var turtle = new Reptile(); 
turtle.bla = 'whatever'; 
turtle.showBla(); 

例2

var Reptile = function() { 
    this.showBla = function() { 
     alert(this.bla); 
    } 
} 

var turtle = new Reptile(); 
turtle.bla = 'whatever'; 
turtle.showBla(); 

は、例1合法ですか?時には "this"をコンストラクタで直接定義するために物事をねじ切っているようです...?!?

+0

はうまく見えます。あなたはコンストラクタで何も定義していないので、単に参照を格納します。全く問題なし。 – jAndy

+0

自分で 'this'を定義することはできません。常に利用可能であり、上書きすることはできません。 – pimvdb

+0

両方の例は防弾であるので、時にはねじを締めるコードを提供できますか? – Esailija

答えて

3

はい、それは正当であり、そこに呼び出される関数の中で関数を定義する必要がある場合に便利です。書籍にはこの変数の名前を付けることをお勧めします。var = this;

1

例1は、現在のインスタンスへの参照を維持するための一般的なパターンです。コールバックの状況では、のように:

setTimeout(turtle.showBla, 0); 

例1のvar reptile...thisの参照を保存し、'whatever'が表示されます。手動で(例えば、jQueryの中で)、呼び出し側のスコープを割り当てない限り、実施例2は、undefinedが表示されます:

setTimeout($.proxy(turtle.showBla, turtle), 0); 
関連する問題