2017-04-19 5 views
0

本でYou Don't Know JS: Scope & Closuresこのサンプルコードは完全にわかりません。条件式内の関数宣言

foo(); // "b" 

var a = true; 
if (a) { 
    function foo() { console.log("a"); } 
} 
else { 
    function foo() { console.log("b"); } 
} 

それが何を意味する:

は、「通常のブロックの中に現れる関数の宣言は、一般的ではなく、このコードが示すように、条件付きであるより、囲みスコープにホイスト」?それはどのように可能ですか?条件は機能していませんか?

+1

引用符で囲まれた文が正しくありません。 – RobG

+1

*「それはどういう意味ですか?」*関数宣言は他の場所と同様に呼び出されます。 * "条件が機能していないのですか?" *動作していますが、コードが実行される前に巻き上げが行われます。実際にはブロック内の関数宣言*が無効なので、実際はもっと複雑です。しかし、ブラウザはそれらを許可し、異なる動作を実装します。 [異なるブラウザで関数の宣言が異なるのはなぜですか?](http://stackoverflow.com/q/8871974/218196) –

+0

'var a = true; const foo = a? ()=> console.log( 'a'):()=> console.log( 'b'); foo(); 'その後、' foo'が吊り上げられないので、コンソールは 'a'をログに記録します。 – Josep

答えて

0

関数の宣言がjavascriptパーサーによってファイルの先頭に移動されているので、それが起こっています。それが吊り上げることによるものです。 fooの最後の宣言は、エレベーターが上げられたときに最初に上書きされます。

+1

説明が間違っています。関数の宣言はブロック内では許可されていないため、ブラウザによっては「ホイスト」するものもあれば、ECMA-262の拡張機能であるものもあります。この動作は現在の仕様では多かれ少なかれ標準化されていますが、その使用はお勧めしません。 [* duplicate link *](http://stackoverflow.com/questions/43135925/why-javascript-function-declaration-behave-differently-in-chrome-and-safari)を参照してください。 – RobG

+0

@RobG - それは間違っています。機能ホスティングについてのこのページのセクションをご覧ください: http://adripofjavascript.com/blog/drips/variable-and-function-hoisting –

+0

特に、そのページでは、あなたは 'isItHoisted'を検索し、機能とそれに伴う説明。 –