2

次の 3 つの例で何が起こっているのか説明してもらえますか? 私の考えは、最初の例でbarあり、実行されない (関数宣言に過ぎない) ため、foo実行されると、出力はundefined? 2 番目の例でbarは、値 3 が返されるように が実行されます。3 番目の例では、なぜ 8 が生成されるのかわかりません。

// 1)
function foo() {
    function bar() {
        return 3;
    }
}
foo(); // undefined

// 2) 
function foo() {
    function bar() {
        return 3;
    }
    return bar();
}
foo(); // 3

// 3)
function foo(){ 
    function bar(){
        return 3;
    }
    return bar();
    function bar() { 
         return 8;
    }
 }
 foo(); // 8
4

6 に答える 6

0

最初の 2 つの例に対するあなたの仮定は正しいです。

が呼び出される前に再定義されている8ため、最後の例は戻ります。イベントの基本的なタイムラインは次のとおりです。barfoo

  1. foo定義されています

    • barを返す関数として定義されています。3
    • barを返す関数として再定義されます。8
  2. foo呼び出される
    • returnステートメントがヒットし、再定義されたbar関数が実行され、戻ります8
于 2015-05-06T19:24:10.550 に答える
0

3 番目の例でbar()は、2 回宣言されています。8 を返す宣言は最後に宣言されるため、再定義bar()して実行される宣言です。

function foo(){ 
    function bar(){ // first declaration of bar()
        return 3;
    }

    return bar(); // this executes the code in bar() as it was most recently redefined

    function bar() { // second and last declaration of bar(); this redefines the
                     // first declaration
         return 8;
    }
 }
 foo(); // 8
于 2015-05-06T19:24:55.627 に答える
0

同じ名前とスコープを持つ関数が 2 回宣言されている場合、最初の関数は無視され、2 番目の関数が実行されます。それが#3で起こっていることです。

于 2015-05-06T19:25:05.383 に答える