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个“{1}}的”定义吗?
希望我的意思很清楚。
答案 0 :(得分:4)
它被称为闭包。创建新函数时当前在范围内的任何变量都与该闭包相关联。
答案 1 :(得分:1)
那么,它将myFunct的10个“定义”存储在堆栈内存中吗?
是的,确实如此。
您的数组包含十个闭包,每个闭包都捕获了自己的myPoint
版本。
答案 2 :(得分:0)
Thiefmaster非常回答你的问题。是的,此代码将使用越来越多的内存,具体取决于数组包含的闭包数量。必须要说的是,大多数现代引擎都会为分配给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的更多抽象方面有点棘手