我已经阅读了关于循环内的闭包和闭包的一些解释.我很难理解这个概念.我有这样的代码:有没有办法尽可能地减少代码,因此闭包的概念可以更清晰.我很难理解i两个括号内的部分.谢谢
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function (num) {
return function () {
alert(num);
};
}(i);
document.body.appendChild(link);
}
}
window.onload = addLinks;
Run Code Online (Sandbox Code Playgroud) 如下代码:
var foo = function() {
var a = 1; // closure var
return function() { // closure fun
console.log(a);
}
};
var bar = foo();
Run Code Online (Sandbox Code Playgroud)
当foo退出(或者说,返回)时,我们知道变量a不会被破坏并保留在内存中(这就是闭包工作的原因).所以我的问题是变量是存储,堆栈还是堆?
我知道闭包被定义为:
[A]堆栈帧,当函数返回时不会释放.(好像'stack-frame'是malloc'ed而不是堆栈!)
但我不明白这个答案如何适应JavaScript的存储机制.口译员如何跟踪这些价值观?浏览器的存储机制是否以类似于堆和堆栈的方式进行分段?
关于这个问题的答案:JavaScript闭包如何工作?说明:
[A]函数引用也有一个关闭的秘密引用
这个神秘的"秘密参考"背后的潜在机制是什么?
编辑许多人说这是依赖于实现的,所以为了简单起见,请在特定实现的上下文中提供解释.
我一直在努力理解以下代码:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
Run Code Online (Sandbox Code Playgroud)
这里add分配了匿名自调用函数的返回值 - 即函数function() { return counter += 1 }.现在第一次add()被调用它1按预期返回.但第二次add()称它返回2.
我的问题是因为counter在函数内定义所以不是每次函数完成执行counter都应该死掉?也就是说,在第一次调用add()1之后将显示.现在我们已经不在那个函数中,所以不应该counter忘记它以前的值并且像automatic变量一样从堆栈中销毁?