2012-10-29 53 views
1

ExampleJavascript將功能數據「保存」在內存中?

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值必須「存儲」在某個地方,用於每個函數。

因此,它將10個「定義」myFunct存儲在堆棧內存中?

希望我明白我的意思。

回答

4

它被稱爲閉包。當你創建一個新函數時,當前在範圍內的任何變量都與該閉包相關聯。

1

因此,它將10個「定義」myFunct存儲在堆棧內存中嗎?

是的,它的確如此。

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

+0

好的JS引擎可能只是存儲一次函數;在多次存儲功能代碼方面沒有多大意義 - 只是範圍需要每次都有所不同。 – ThiefMaster

+0

人們會希望如此。我不打算暗示其他情況。 – Thilo

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的更多方面有點棘手