2017-07-29 9 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

@impregnable悪魔によって示唆されているようにfunction hoistingを検索します。あなたのコードでは、たとえあなたがa=10;を宣言しても、Javascriptはすべてのコードをスキャンし、何か他のことをする前に見つけたすべての定義された関数を引き出します。したがって、関数function a() {}が見つかり、console.logが呼び出される前にa=10を上書きします。

0

あなたのコードは、このコードと同等です:すべての「VAR」と「機能」の

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大丈夫、あなたが私のエラーに気づいたことを:)私は今修正していますか?その場合。品種: –

+0

ECMA-262、[ブロックにはステートメントのみが含まれています](https://tc39.github.io/ecma262/#sec-block)、FunctionDeclarationはステートメントではありません。 ECMAScript 5は、[StatementとしてのFunctionDeclarationsの使用は推奨されていません](https://es5.github.io/x12.html#x12)と明言しました。ブロック内で定義されている関数について、理解しているものからの巻上げ動作は定義されていません。ノードはちょうどその機能をブロックの上部に持ち上げる。 [SpiderMonkeyがブロック内に定義された関数を呼び出さないケースがあります。](http://statichtml.com/2011/spidermonkey-function-hoisting.html) –

関連する問題