我正在尝试了解闭包,正在查看W3Schools的javascript教程。这是他们通过制作一个计数器给出的一个例子。
<body>
<p>Counting with a local variable.</p>
<button type="button" onclick="myFunction()">Count!</button>
<p id="demo">0</p>
<script>
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
</script>
</body>
示例说明为变量add分配了a的返回值 自我调用功能。
自调用函数只运行一次。它将计数器设置为零 (0),并返回一个函数表达式。
这种方式成为一种功能。 “精彩”部分就是它可以 访问父范围内的计数器。
这称为JavaScript闭包。这使得它成为可能 函数有“私有”变量。
计数器受匿名函数范围的保护,并且 只能使用添加功能进行更改。
注意闭包是一种可以访问父作用域的函数 在父函数关闭之后。
解释并不错,但有些事情尚不清楚。为什么自我调用函数最好用?为什么嵌套的匿名函数不是自调用函数?当计数器已在其中返回时,为什么还必须返回整个匿名函数?
答案 0 :(得分:1)
闭包的概念可以解释为具有功能及其背景。上下文在某种程度上是附加到函数的存储,用于解析捕获的变量(因此命名为closure?)。
执行示例代码时:
var add = (function () {
var counter = 0; // This is promoted to the below's function context
return function () {return counter += 1;}
})();
您创建了一个上下文,其中counter
变量被提升为匿名函数上下文,因此您可以从当前范围访问该变量。
这个图表或多或少地解释了它:
在这种情况下,X和Y由函数上下文捕获,并在该函数的所有执行中执行。
现在,这只是lexical environments的V8实现。
请参阅Vyacheslav Egorov关于使用V8的闭包实现的很好解释:Grokking V8 closures for fun (and profit?)