2013-07-04 42 views
-1
<script> 
sayHi(); 
if (1) { 
    function sayHi() { console.log(1) } 
} else { 
    function sayHi() { console.log(2) } 
} 
</script> 

'如果' 條件在鍍鉻>控制檯,它表明:2試圖找出在JS

問:

爲什麼if(1)=false

+1

此代碼實際上是**定義不清的行爲**(實際上,它是*官方規範中的語法無效*)。不同的瀏覽器會產生不同的結果;比較FF和IE。 *不要在頂級函數/程序體外使用FunctionDeclarations!* – Paul

+0

@Paul:你能鏈接到規範的相關部分嗎? – Blender

+0

@Blender請參閱http://es5.github.io/#x12的註釋「已知幾種廣泛使用的ECMAScript實現支持將FunctionDeclaration用作語句。但是,在實現中存在重要且不可調和的變體語義應用於這樣的FunctionDeclarations。由於這些不可調和的差異,*使用FunctionDeclaration作爲語句會導致代碼在實現中不可靠移植* ..「(這種語言在ES5中添加,但語法*無效*在第3版和第5版中)。 – Paul

回答

3

這些函數定義在執行該條件時未定義。這兩個功能在開始時都懸掛起來,而後者則覆蓋前者。

if(1)將始終評估爲真。

這種提升方式正是使您能夠在明確定義之前調用該功能的原因。以下代碼將記錄1,但請注意,在這種情況下,您必須在條件之後調用它,否則您將收到錯誤undefined is not a function

if (1) { 
    var sayHi = function() { console.log(1) } 
} else { 
    var sayHi = function() { console.log(2) } 
} 
sayHi(); 
+0

ECMAScript 3/5下的行爲(問題中的代碼)沒有明確定義,不同的瀏覽器對它的處理方式不同。語法結構本身實際上是被禁止的。請參閱http://es5.github.io/#x12上的NOTE – Paul