1

我正在學習關於這個標識符,我知道,當一個函數是不是在對象上調用那麼這指的是在非嚴格模式的窗口對象。因此,我期望this.bar記錄「無論如何」。爲什麼Chrome控制檯中的結果與崇高不同?這JS

「無所謂」是輸出,當我跑我在Chrome console.it代碼,但輸出是不確定的,當我使用節點構建系統崇高我的代碼運行。

爲什麼是這樣呢?我確定Chrome控制檯的結果是正確的嗎?還有什麼時候可以遇到這樣的問題?

這裏是我的代碼

function foo() { 
    // console.log(this) 
    console.log(this.bar); 
} 

var bar = "whatever"; 


// -------- 

foo();    // OUTPUT is "whatever" in the Chrome console and OUTPUT is undefined in Sublime's Node build system. 
+1

可能重複[「this」關鍵字是如何工作的?](http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Claies

回答

1

當你在一個函數中使用this沒有指定一個不同的上下文,它指的是全局對象。在Chrome中,這將是window對象。在Node中,這被稱爲global。當我說指定不同的上下文中,這將是,例如,使用用於new一個構造函數,或callapply功能結合特定this

主要區別在於,當您在節點中使用var bar = "whatever";時,使用var將變量作用於您正在編寫的模塊,而不是整個節點進程。在Chrome中,你就作用域全球window對象。這與完全忽略var一樣。

我在下面添加了一些關於範圍的例子,只是爲了讓它更清楚些。在控制檯中玩耍是發現這種事物的好方法。

實施例1: Example 1 正如你可以看到,主叫test()創建了全球範圍x可變的,並且this被發現是指window變量。

實施例2: Example 2 在這個例子中,我們構建了一個新的實例,它創建了一個新的範圍。變量x不在全局範圍內。訪問它的唯一方法是使用myInstance上下文。

至於你的問題,你有兩個選擇:

選項1(推薦):由於欄中沒有全局範圍,你不想訪問使用this

var bar = "whatever"; 

function foo() { 
    console.log(bar); 
} 
全局變量

選項2(不推薦): 這將設置變量是在全球範圍內,因此您可以使用thisglobal

global.bar = "whatever"; 

function foo() { 
    console.log(this.bar); // console.log(global.bar); 
} 
0

當你在這樣var bar = 'something'節點聲明變量聲明它不是全球性的,但模塊作用域。您應該使用global對象來聲明全局變量。事情是這樣的:

global.bar = 'something'; 
0

我不是100%肯定,但我假設它的東西做的Window對象。您定義的功能屬於全局窗口對象。也許節點構建系統沒有這個全局對象。

相關問題