2013-07-29 125 views
4

在下面的示例中,JavaScript似乎完全忽略了我的return語句,並且只是執行代碼。返回後執行的JavaScript代碼

var x = 1; 
(function() { 
    x = 2; 
    return; 
    var x = 3; 
})(); 
console.log(x); // Outputs 1 in both Chrome and FF 

肯定的代碼應該輸出2?如果我從var x = 3中刪除var關鍵字,則會按預期輸出2。這裏有一些奇怪的編譯器優化工作嗎?

+0

我認爲'x'在函數內部是不同的。簡單的修復就是'window.x = 2' – Madushan

+1

由於@dystroy表示變量聲明被提升到函數作用域的頂部。因此,因爲你有var x = 3,所以var x get被懸掛在頂端,並使x = 2成爲局部變量。如果你只是把x = 3(沒有var),那麼console.log會輸出2 –

回答

8

否,代碼不應該輸出2,因爲變量聲明懸掛讓你的代碼就相當於

var x = 1; 
(function() { 
    var x; 
    x = 2; // changes the internal x variable 
    return; 
    x = 3; // does nothing because it's not reached 
})(); 
console.log(x); // Outputs the outside x, which is still 1 

x = 2; 

只改變內部x變量,陰影外一。

非全局變量的作用範圍是整個函數聲明。從此功能開始到結束。