var a=10;
if(a===10){
console.log(a);
function a(){}
console.log(a);
}
因爲,如果條件爲真,那麼console.log中的兩個值爲什麼會在chrome v58中以函數形式出現,而在IE 8中以10形式出現?請參閱Chrome和IE8控制檯輸出的屏幕截圖。爲什麼控制檯輸出作爲一個函數?
鉻:
IE 8:
var a=10;
if(a===10){
console.log(a);
function a(){}
console.log(a);
}
因爲,如果條件爲真,那麼console.log中的兩個值爲什麼會在chrome v58中以函數形式出現,而在IE 8中以10形式出現?請參閱Chrome和IE8控制檯輸出的屏幕截圖。爲什麼控制檯輸出作爲一個函數?
鉻:
IE 8:
查找function hoisting
通過@impregnable惡魔的建議。在你的代碼中,即使你聲明瞭a=10;
,Javascript也會掃描所有代碼,並在執行任何其他操作之前將所有已定義的函數全部取出。因此,它會找到函數function a() {}
,並在調用console.log
之前覆蓋a=10
。
您的代碼就相當於這個代碼:
var a = 10;
if (a===10) {
var a = function() {};
console.log(a);
console.log(a);
}
首先「變種」和「功能」的進入範圍的開始。閱讀關於範圍,特別是提升。
這實際上並不正確。涉及到吊裝,但是您的代碼變體將函數定義提升到'var a = 10;'上方。所以你的代碼將打印'10 \ n10',而OP的代碼打印出'function a(){} \ nfunction a(){}'。 –
@VartanChristopherSimonian好的,thx,你已經注意到我的錯誤:)我現在正確嗎?在那種情況下。 –
種類。根據ECMA-262,[塊只能包含語句](https://tc39.github.io/ecma262/#sec-block),並且FunctionDeclaration不是語句。 ECMAScript 5甚至明確表示[不鼓勵使用FunctionDeclarations作爲語句](https://es5.github.io/x12.html#x12)。所以,從我所瞭解的提升行爲來說,對於塊中定義的函數是未定義的。節點恰好將函數提升到塊的頂部。 [這是SpiderMonkey不會提升塊中定義的任何功能的情況。](http://statichtml.com/2011/spidermonkey-function-hoisting.html) –
因爲你在第4行定義了一個'''a'''作爲函數。這一行等價於'''var a = function(){};''' – Wainage
因爲有些東西被命名吊裝。 –
正如上面的評論所說,嘗試刪除作爲一個函數下面的定義,看看它是什麼 –