這很簡單:JS扯起變量聲明當前作用域的頂部,但是任何操作(包括轉讓)不(當然在同一範圍內,請參閱第二個案例解釋)。所以,你的代碼片段轉換爲
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
通過留出了var,進入範圍掃描(檢查變量在全球範圍內被宣佈)。
不幸的是,在這樣做時,第一次使用var的上下文丟失了(在分支中),並且分配也被掛起。隱含的全球翻譯爲
:
感謝上帝,這是不正確的。我以爲是因爲我在控制檯上測試了一些似乎證實了這一點的東西。在這種情況下,@amadan是正確的:您使用的是全局變量(當我發佈這個變量時,在您的代碼段中錯誤地稱爲greeting
)。我將在下面留下代碼(更正它)以顯示實際上隱含的全局變量,希望有助於某人理解JS中的範圍/範圍掃描。
var currentSize = 'hello';
//well, actually implied globals can be deleted, so it's more like
Object.defineProperty(this,'currentSize',{value:undefined,
writable:true,
enumerable:true,
configurable:true});
(function()
{
if (currentSize == 'hi')//always false
{//this still doesn't get executed
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined
}());
+1那麼措辭清楚的答案。 – Aesthete
確實爲你的先生。 –
@bfavaretto:我認爲'var greeting'是一個錯誤,應該是'var currentSize'全局變量聲明(在第一個例子中已經被遮蓋了,並且在第二個例子中被使用了)。否則,這將是完全不相關的例子。 – Amadan