2013-07-24 88 views
2

我已經經歷的Javascript功能範圍,並已運行到這一點:的Javascript奇數範圍界定行爲

var scope = "global"; 

function f(){ 
    console.log(scope); 

    var scope = "local"; 

    console.log(scope); 
} 

f(); 

現在我明白,第一個日誌的輸出爲「不確定」,因爲JS如何在吊變量函數的頂部。但是當我從var var =「local」中刪除var時,第一個日誌輸出「全球」,這讓我撓了撓頭。有人可以解釋爲什麼會發生這種情況嗎?我的意思是不js順序運行代碼?因此,如何消除VAR對第一個日誌有任何影響?

+1

你的var語句使「範圍」本地,隱藏全局。一旦你定義它,它將成爲你設置的字符串的本地。由於var提升,你的函數在內部作爲函數運行f(){var scope; ... – dandavis

+0

提升起重吊裝...我會嘗試找到一個重複的問題指向你。 – bfavaretto

+0

[奇怪的JavaScript範圍問題]的可能的重複(http://stackoverflow.com/questions/17662458/strange-javascript-scoping-issue)。另見:http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html – bfavaretto

回答

2

兩遍解析。該代碼將被視爲好像它是

function f() { 
    var scope; // var created, but no value assigned. this overrides the earlier global 
    console.log(scope); 
    scope = 'local'; 
    console.log(scope); 
} 

該變種的創建將被執行,如果它是在函數中執行代碼的第一個位。但實際的分配操作將不會發生,直到它通常會發生。

+0

Aha。所以,如果我理解正確,如果我刪除變量範圍的變量聲明,js將自動將變量提升到函數的頂部。但是如果我宣佈它,那麼就沒有必要提升它,它的範圍僅限於這個功能? – Frisbetarian

+1

在f()函數內執行'var scope'會創建一個新的局部變量,其名稱恰好與您在函數外定義爲全局變量的名稱相匹配。範圍的新「內部」副本將是f()中任何「較低」範圍內使用的副本。如果你刪除'var'定義,那麼JS將簡單地使用'全局'副本,因爲你還沒有用另一個本地副本隱藏它。閱讀@ user2468852已鏈接到下面的文章。這是對發生的事情的很好的評論。 –

1

如果省略var語句,則第一個日誌將使用全局變量,該變量由字符串「global」設置。沒有其他局部變量,也沒有提升。

  1. 第一個日誌:全局變量的作用域與分配新的字符串的
  2. 「全球性」內容相同的全局變量
  3. 二日誌設置:全局變量的作用域爲「本地」的內容設置