2017-07-29 62 views
1
var a=10; 
if(a===10){ 
    console.log(a); 
    function a(){} 
    console.log(a); 
} 

因爲,如果條件爲真,那麼console.log中的兩個值爲什麼會在chrome v58中以函數形式出現,而在IE 8中以10形式出現?請參閱Chrome和IE8控制檯輸出的屏幕截圖。爲什麼控制檯輸出作爲一個函數?

鉻:

enter image description here

IE 8:

enter image description here

+1

因爲你在第4行定義了一個'''a'''作爲函數。這一行等價於'''var a = function(){};''' – Wainage

+5

因爲有些東西被命名吊裝。 –

+0

正如上面的評論所說,嘗試刪除作爲一個函數下面的定義,看看它是什麼 –

回答

1

查找function hoisting通過@impregnable惡魔的建議。在你的代碼中,即使你聲明瞭a=10;,Javascript也會掃描所有代碼,並在執行任何其他操作之前將所有已定義的函數全部取出。因此,它會找到函數function a() {},並在調用console.log之前覆蓋a=10

0

您的代碼就相當於這個代碼:

var a = 10; 
if (a===10) { 
    var a = function() {}; 
    console.log(a); 
    console.log(a); 
} 

首先「變種」和「功能」的進入範圍的開始。閱讀關於範圍,特別是提升。

+1

這實際上並不正確。涉及到吊裝,但是您的代碼變體將函數定義提升到'var a = 10;'上方。所以你的代碼將打印'10 \ n10',而OP的代碼打印出'function a(){} \ nfunction a(){}'。 –

+0

@VartanChristopherSimonian好的,thx,你已經注意到我的錯誤:)我現在正確嗎?在那種情況下。 –

+0

種類。根據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) –

相關問題