我有这个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);
};
} ;
我最近一直在阅读关于关闭的 。
有一件事我不明白。
0
。很好。(到目前为止我理解这一点。)
但是i == 1会发生什么?
1
值。确定但等等!它已经为“0”值保存了“闭包”!
这个结构(闭包)是否在内存中为每次迭代创建一个新空间?
如果是的话 - 怎么会这样?我们只有一个集中的aaa
功能!
答案 0 :(得分:4)
您的aaa
功能就像一个功能工厂;每次调用都会返回一个 new 函数(不一样),其执行上下文中的num
变量设置为aaa
的初始参数。
答案 1 :(得分:2)
每次调用aaa
时,它都会创建一个具有完全不同的上下文/范围的new
函数,即使您使用相同的参数。 闭包确实使用内存空间来保留上下文值。
答案 2 :(得分:0)
我想在这个和类似的问题中添加一个词:在每次调用外部函数(在本例中为aaa
)时,都有一个不同的局部变量{{1创建,保存从num
传递的值。每个内部函数实例(在本例中为匿名函数)都会记住变量i
的不同版本,并在每个num
调用中创建。
如果来自外部函数的函数调用的参数(在这种情况下为aaa(i)
)不是通过值而是通过引用传递,那么不同的版本本地aaa(i)
可能指向同一个对象。