1

var myFunctArray=new Array();

for(var i=0; i<10; i++) {
    addValues(i);
}

function addValues(myPoint)
{
    myFunct=function () {
        var myVar="Line " + myPoint;
        console.log(myVar);
    }    

    myFunctArray.push(myFunct);        
}

myFunctArray[3]();

4°関数を呼び出すと、myPointの値をどのように記憶できますか?実際、これは3行目の出力であるため、関数ごとにmyPoint値をどこかに「格納」する必要があります。

それで、myFunctスタックメモリに10個の「定義」を格納しますか?

私が何を意味するのかが明確であることを願っています。

4

3 に答える 3

4

それは閉鎖と呼ばれます。新しい関数を作成するときに現在スコープ内にある変数はすべて、そのクロージャーに関連付けられます。

于 2012-10-29T12:01:05.907 に答える
1

それで、それはスタックメモリにmyFunctの10の「定義」を保存しますか?

はい、そうです。

配列には10個のクロージャが含まれており、それぞれが独自のバージョンのをキャプチャしていmyPointます。

于 2012-10-29T12:01:05.137 に答える
0

泥棒マスターはあなたの質問にかなり答えました。はい、このコードは、配列に含まれるクロージャの数に応じて、ますます多くのメモリを使用します。最近のほとんどのエンジンは、変数に割り当てられた関数への参照と、クロージャー変数を含むMyFunct特定の「呼び出しオブジェクト」を割り当てると言わなければなりません。言い換えると、配列は次のようになります。

myFuncArray[0] = {call:
                     {myPoint:'Whatever value was passed to the addValues function the first time'},
                  valueOf: myFunct};
//the actual value is a reference to myFunct
//JS provides an implicit link to the call property, which is bound to this particular reference
myFuncArray[1] = {call:
                     {myPoint:'The value passed to addValues the second time'},
                 valueOf: myFunct};

オブジェクト自体にアクセスすることはできませんが、これはJSがどのように物事をメモリ内に整理しておくかを考える方法にすぎません。
トピックから少し外れていますが、MyFunct変数を使用して暗黙のグローバルを作成しています。

function addValues(myPoint)
{
    var anotherClosureVar = 'This will be accessible, too: it\'s part of the closure';
    var myFunct = function()
    {//use var to declare in addValues scope, instead of using an implied global
        var myVar="Line " + myPoint;
        console.log(myVar);
        console.log(anotherClosureVar);//will work, too
    };
    myFunctArray.push(myFunct);
}

全体として、これがコードである場合、メモリはそれほど大きな問題にはならないはずです。このコードが古いJScriptエンジンで実行されたとしても、意味のある量のメモリを使い果たすまでには少し時間がかかります。
それでも、このようなことを考えるのは良い習慣です。私はここで理にかなっていると思います。私はネイティブスピーカーではないため、JSのより抽象的な側面を説明するのはやや難しいです。

于 2012-10-29T12:25:15.227 に答える