2014-11-21 38 views
4
var confirm = confirm('Are you sure?'); 

我剛剛測試了這個聲明,並且給出了一個錯誤,指出confirm不是函數。Javascript Statement執行命令

我立即檢測到變量名稱正在覆蓋它。然而我的問題是爲什麼?

我知道函數是第一類,並且聲明與函數同名的變量將在相對範圍內覆蓋它。但是我的困惑來自於我認爲是從右到左的執行順序,I.E.函數調用在確定目標之前進行。

在這種情況下函數調用之前變量是否被定義?

+3

_「是否變量成爲在這種情況下在函數調用之前定義?「_ - 是的。在給定範圍內,所有變量都在該範圍內的代碼執行之前被定義,並且它們最初被賦予值「undefined」。閱讀JS變量「提升」。 – nnnnnn 2014-11-21 11:36:37

+0

在這裏看起來很好http://jsfiddle.net/batug0o5/1/ – 2014-11-21 11:39:37

+1

'var'不是可執行語句,受制於從上到下或從右到左的規則或任何其他執行順序。這是一個**聲明**,正如@nnnnn所說,它已經被掛起。 – 2014-11-21 11:40:34

回答

6

由於JavaScript的變量提升:

function myFunction() { 
    // ... 
    var confirm = confirm('Are you sure?'); 
    // ... 
} 

變爲:

function myFunction() { 
    var confirm; 
    // ... 
    confirm = confirm('Are you sure?'); 
    // ... 
} 

您將需要執行以下操作來執行你的意思:

function myFunction() { 
    // ... 
    var confirm = window.confirm('Are you sure?'); 
    // ... 
} 
+1

在任何情況下,重寫'confirm()'函數都不是一個好主意。你可能應該有'var confirmResult = window.confirm('你確定?');'保持清潔 – deitch 2014-11-21 11:44:22

+0

@deitch這是我的一部分,我已經改名爲變量。我只是想知道是什麼導致了這種行爲:) – Flosculus 2014-11-21 11:46:46

+1

明白了。我認爲@Phylogenesis做了一個很好的解釋與變量提升。 – deitch 2014-11-21 11:47:49