2016-03-30 31 views
1

我正在學習JavaScript自己。今天我遇到了一個代碼示例,這是很混亂。Javascript函數變量應該生成錯誤,而不是未定義

function fool(a, b){ 

    if(b) 
     var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Returns "Mary" 
fool(1, false); //Returns undefined instead of error 

在另一方面,如果我這樣做

function fool(a, b){ 

    //if(b) 
    // var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Firebug error: ReferenceError: c is not defined 
fool(1, false); 

的錯誤是在第一次機會出現。這是怎麼回事?

+3

閱讀有關[_variable hoisting_(http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) – Rayon

回答

2

援引MDN

變種吊裝

由於變量聲明(和一般聲明)被執行的任何代碼之前被處理,任何地方聲明變量在代碼中相當於聲明它在頂部。這也意味着變量可以在聲明之前使用。這種行爲稱爲「提升」,因爲看起來變量聲明被移到函數或全局代碼的頂部。

例子:

bla = 2 
var bla; 
// ... 

// is implicitly understood as: 

var bla; 
bla = 2; 

對於你的具體情況:

// Your code 
function fool(a, b){ 
    if (b) 
     var c = "Mary" 
    alert(c); 
} 

// Equivalent code 
function fool(a, b){ 
    var c = undefined; 
    if (b) 
     c = "Mary"; 

    alert(c); 
} 

作爲一個側面說明,使用Javascript的發展。

引入了let關鍵字,它的工作方式與您的期望相同,但並未在所有瀏覽器中受支持,所以您只能在控制JavaScript VM時使用它(如使用NodeJS,nw.js,...)

0

你已經評論了變量'c'並試圖顯示它。它會給你一個錯誤,因爲沒有變量定義爲'c'。

代碼中有拼寫錯誤。

嘗試這種

if(b){ 
    alert(c); 
} 
+0

,但也沒有聲明第一碼和'傻瓜(1,錯誤);'呼叫。由於'b'是假的,它不會進入if區塊。 – Marymon

0
function fool(a, b){ 

    if(b) 
     var c = "Mary" 
    alert(c); 
} 

fool(1, true); //Returns "Mary" 
fool(1, false); //Returns undefined instead of error 

讓我們打破 -

要調用它通過bfalse它去if環,只考慮1號線作爲if一部分,並繼續執行下一行是alert(c)功能。由於b='false'所以它不會將Marry分配給c變種。因此,現在您正在提醒c這是undefined,因爲if將不會處理它,直到b在函數參數中爲true。

+0

如果沒有定義任何東西。它應該拋出'參考Error' – Rayon

+0

因爲'C'的定義,但不執行? –

1

這是JS引擎將如何重新安排你的第一個例子:

function fool(a, b){ 
    // statement always executed, no matter what 
    var c; 

    if (b) 
     c = "Mary" 

    alert(c); 
} 

不管if語句被執行或不var c語句獲取hoisted到函數體的頂部,因此在聲明當前的功能範圍。

+0

始終使用ccuryl括號! – TEST

0

有兩件事我注意到在代碼 1)如果範圍:當你不使用括號({})它將只需要在If塊下的第一句話。因爲如果條件成立,否則翻譯者不會知道。 所以你的代碼是

if(b) 
     var c = "Mary" 
alert(c); 

應該像

if(b){ 
     var c = "Mary" 
    alert(c); 
} 

如果你想警報(三)僅如果條件真執行。

2)提升:現在的第二個問題是,即使你的條件是假,一句話不執行怎麼來的通知不確定的原因是可變的吊裝這是任何代碼執行之前執行的變量聲明。所以,即使你做這樣的代碼

var k="something"; 

它會首先聲明ķ可變 像

var k=undefined; 
k="something"; 

所以在你的代碼的第一個C聲明則執行代碼正在發生的事情。

我希望這將有助於