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 个“定义”吗?

是的,它确实。

您的数组包含十个闭包,每个闭包都捕获了自己的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 回答