2017-05-14 163 views
1

我是JavaScript新手我需要一些幫助才能瞭解這個關鍵字在JavaScript中的工作原理。當我運行下面的代碼時,結果很明顯。這個如何在JavaScript中工作?

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

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

var a = 'global a'; 

obj.foo(); // 2 

但如果我運行下面的代碼,然後wthen打印全局a而不是obj.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' with'window.bar(); //'全球a''? –

+0

是否有默認綁定適用?因爲bar()是普通和底層呼叫。 –

回答

0

在你第一個例子中,當你調用函數foo上變量objthis的上下文是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上調用。
在你只給扎到,所以當它被調用它的函數的引用您的第二個例子打印類的成員變量,在這種情況下a = global a

相關問題