2017-05-14 17 views
1

JavaScriptの新機能こののキーワードはJavaScriptで動作します。次のコードを実行すると、結果は明らかです。「this」はJavaScriptでどのように機能しますか?

function foo() { 
    console.log(this.a); 
} 

var obj = { 
    a: 2, 
    foo: foo 
}; 

var a = 'global a'; 

obj.foo(); // 2 

ただし、次のコードを実行すると、obj.aの代わりにグローバルなaが印刷されます。

function foo(){ 
    console.log(this.a); 
} 

var obj = { 
    a:2, 
    foo:foo 
} 

var bar = obj.foo; 
var a = 'global a'; 

bar(); 

この印刷用のグローバルな理由を教えてください。

+0

、あなたのファイルの先頭に' 。汚いモード期間をターゲットにしないでください。 –

+0

'window'がグローバルスコープであると仮定すると、' window.obj.foo();を比較するとより明らかになります。 // 2 'を 'window.bar(); // 'グローバルa''? –

+0

デフォルトバインディングが適用されますか? bar()は平らで下塗りされているからです。 –

答えて

0

を関数への参照を与えている、あなたの第二の例では
変数objの場合、thisのコンテキストはobjです。だからこそa == 2です。ここで、関数fooを変数barに参照すると、thisのコンテキストはグローバルwindowであり、このコンテキストの変数aglobal aです。この場合、関数fooを最初の例と同じように動作させるには、objコンテキストにバインドすることができます。このように:

function foo(){ 
 
    console.log(this.a); 
 
} 
 

 
var obj = { 
 
    a:2, 
 
    foo:foo 
 
} 
 

 
// bind the context to obj 
 
var bar = obj.foo.bind(obj); 
 
var a = 'global a'; 
 

 
bar();
私は自分自身を明確にすることを願ってい

...;)あなたはいつも「厳格な使用」 `書き込みを使用する必要が

+1

ありがとう@juliobetta これはこのコードでどのように動作するのか理解しています... –

-1

最初のコードobjにはa変数があり、foo()関数はobjで呼び出されます。それは、クラスのメンバ変数を印刷し呼び出されたときに、あなたが上の機能fooを呼び出すときにのみ、あなたの最初の例では、この場合には、そのバーにa = global a

関連する問題