4

JavaScript クロージャがメモリに及ぼす影響をよりよく理解したいと思います。

function fee(arg){

  function figh(){
    //some code
     fum(passOnSomeARG)
  }     

  function fo(y){
    //some calculations with y
  }

  function fum(x){
    //some code
     fo(x)
  }

  figh()
}

上記の例では、「fee()」が呼び出されるたびに内部関数がメモリに再読み込みされますか? もしそうなら、これは効率的ですか?そうでない場合、何が起こっているのですか?

補足: fee() は、連続して何度も呼び出される可能性があります (ループまたは onmousemove のマウスイベントのいずれか)。

4

2 に答える 2

3

そう思います、はい。これを行う方が効率的です:

(function() {
    var figh = function() {
        // some code
        fum(passOnSomeARG);
    };
    var fo = function(y) {
        // some calculations with y
    };
    var fum = function(x) {
        // some code
        fo(x);
    };
    window.fee = function(arg) {
        figh();
    };
})();
于 2012-10-01T17:27:32.370 に答える
2

このコードを考えてみましょう:

function foo(){
  function local(){ ... local code ... }     
  local();
}

内部的には、JS VMはfoo()の本体を次のシーケンス(擬似コード)に変換します。

var local = new Function({bytecode: local code});
local();

したがって、fooを呼び出すたびに、関数の新しいインスタンスが割り当てられます。通常、関数インスタンスは、その本体がいくら大きくても、比較的小さなオブジェクトです。しかし、それでも-割り当てが発生し、ヒープマネージャーは各foo()呼び出しの後に残ったガベージを収集するためにビジーになります。

于 2012-10-01T18:05:59.740 に答える