[英]Javascript prototype operator performance: saves memory, but is it faster?
[英]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.