4

次のコード:

a = function(b) {

    return alfa() + b;

    function alfa() {
        return 7;
    }
}

console.log(a(4));
console.log(a(5));

a()を呼び出すたびに関数alfa()が作成されますか?

4

4 に答える 4

5

はい、そうなります。

関数宣言とによって宣言された変数varは両方とも、関数の呼び出し時に引き上げられます。つまり、関数コンテキストのどこで関数宣言が宣言されているかに関係なく、技術的には常に事前に宣言されます。

a = function(b) {
    return alfa() + b;

    function alfa() {
        return 7;
    }
}

技術的になります

a = function(b) {
    function alfa() {
        return 7;
    }

    return alfa() + b;
}
于 2013-02-28T08:57:50.570 に答える
2

a()を呼び出すたびに関数alfa()が作成されますか?

新しい関数オブジェクトは毎回作成され、はい、異なる実行コンテキストにバインドされます(したがって、作成時bに渡された値にアクセスできます。これは、呼び出し先のコンテキストに対する「クロージャー」です。作成されました)。aalfaa

スマートJavaScriptエンジン(V8など)は、基盤となるコードを再利用できますが、毎回異なるオブジェクトが作成されます。

于 2013-02-28T08:58:33.503 に答える
1

はい、そうなります。を呼び出すたびaに、の新しいインスタンスalfaが作成されます。

ちなみに、この場合、コンテキストをalfa 閉じaます。これは私たちがクロージャと呼んでいるものであり、異なる呼び出しの間の関数で状態を保持することを可能にします。

于 2013-02-28T09:02:02.283 に答える
1

はい。

使用する構文は、このための砂糖です:

a = function(b) {
    var alfa = function() {
            return 7;
    }
    return alfa() + b;
}

console.log(a(4));
console.log(a(5));

alfaを実行するたびに、作成および割り当てが明確になりますa

この簡単な変更でテストすることもできます:

a = function(b) {
    return alfa; // let's return the function
    function alfa() {
            return 7;
    }
}
console.log(a(4)==a(4)); // logs false

alfa毎回作成されることを避けたい場合は、これを行うことができます:

a = (function(){
  var alfa = function() {
     return 7;
  }
  return function(b) {
     return alfa() + b; 
  }
})();
于 2013-02-28T09:02:39.770 に答える