javascript闭包是否为每次迭代在内存中创建了一个新的保留空间?

时间:2011-12-11 11:41:33

标签: javascript closures

我有这个closure代码:

    for (var i = 0, link; i < 5; i++)
    {
        link = document.createElement("a");

        link.onclick = aaa(i);
        document.body.appendChild(link);
    }

    function aaa(num)
            {
                return function ()
                {
                    alert(num);
                };
            } ;

我最近一直在阅读关于关闭的

有一件事我不明白。

  • 当i == 0时,它来到aaa,i = 0并被执行,返回新函数,应该锁定0

很好。(到目前为止我理解这一点。)

但是i == 1会发生什么?

  • 再次来到 SAME aaa ,现在它应该锁定1值。确定

但等等!它已经为“0”值保存了“闭包”!

这个结构(闭包)是否在内存中为每次迭代创建一个新空间?

如果是的话 - 怎么会这样?我们只有一个集中的aaa功能!

3 个答案:

答案 0 :(得分:4)

您的aaa功能就像一个功能工厂;每次调用都会返回一个 new 函数(不一样),其执行上下文中的num变量设置为aaa的初始参数。

答案 1 :(得分:2)

每次调用aaa时,它都会创建一个具有完全不同的上下文/范围的new函数,即使您使用相同的参数。 闭包确实使用内存空间来保留上下文值。

答案 2 :(得分:0)

我想在这个和类似的问题中添加一个词:在每次调用外部函数(在本例中为aaa)时,都有一个不同的局部变量{{1创建,保存从num传递的值。每个内部函数实例(在本例中为匿名函数)都会记住变量i的不同版本,并在每个num调用中创建。

如果来自外部函数的函数调用的参数(在这种情况下为aaa(i))不是通过值而是通过引用传递,那么不同的版本本地aaa(i)可能指向同一个对象。