-1
<script>
sayHi();
if (1) {
function sayHi() { console.log(1) }
} else {
function sayHi() { console.log(2) }
}
</script>
'如果' 條件在鍍鉻>控制檯,它表明:2
試圖找出在JS
問:
爲什麼if(1)=false
?
<script>
sayHi();
if (1) {
function sayHi() { console.log(1) }
} else {
function sayHi() { console.log(2) }
}
</script>
'如果' 條件在鍍鉻>控制檯,它表明:2
試圖找出在JS
問:
爲什麼if(1)=false
?
這些函數定義在執行該條件時未定義。這兩個功能在開始時都懸掛起來,而後者則覆蓋前者。
if(1)
將始終評估爲真。
這種提升方式正是使您能夠在明確定義之前調用該功能的原因。以下代碼將記錄1
,但請注意,在這種情況下,您必須在條件之後調用它,否則您將收到錯誤undefined is not a function
。
if (1) {
var sayHi = function() { console.log(1) }
} else {
var sayHi = function() { console.log(2) }
}
sayHi();
ECMAScript 3/5下的行爲(問題中的代碼)沒有明確定義,不同的瀏覽器對它的處理方式不同。語法結構本身實際上是被禁止的。請參閱http://es5.github.io/#x12上的NOTE – Paul
此代碼實際上是**定義不清的行爲**(實際上,它是*官方規範中的語法無效*)。不同的瀏覽器會產生不同的結果;比較FF和IE。 *不要在頂級函數/程序體外使用FunctionDeclarations!* – Paul
@Paul:你能鏈接到規範的相關部分嗎? – Blender
@Blender請參閱http://es5.github.io/#x12的註釋「已知幾種廣泛使用的ECMAScript實現支持將FunctionDeclaration用作語句。但是,在實現中存在重要且不可調和的變體語義應用於這樣的FunctionDeclarations。由於這些不可調和的差異,*使用FunctionDeclaration作爲語句會導致代碼在實現中不可靠移植* ..「(這種語言在ES5中添加,但語法*無效*在第3版和第5版中)。 – Paul