簡體   English   中英

Javascript“保存”功能數據在內存中?

[英]Javascript “saves” function data in memory?

范例

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個“定義”嗎?

希望我的意思很清楚。

這稱為關閉。 創建新函數時,當前作用域中的所有變量都與該閉包關聯。

那么,它在堆棧存儲器中存儲myFunct的10個“定義”嗎?

是的,它確實。

您的數組包含十個閉包,每個閉包都捕獲了自己的myPoint版本。

小偷大師幾乎回答了您的問題。 是的,此代碼將使用越來越多的內存,具體取決於數組包含的閉包數量。 必須說,大多數現代引擎都會為分配給MyFunct變量的函數和包含閉包var的特定“調用對象”分配一個引用。 換句話說,您的數組看起來將類似於:

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更抽象的方面有些棘手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM