[英]need more explanation on w3schools javascript closure example
我试图了解闭包,并且正在查看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被分配了一个自调用函数的返回值。
自调用功能仅运行一次。 它将计数器设置为零(0),并返回函数表达式。
这样添加就成为一个功能。 “很棒”的部分是它可以访问父作用域中的计数器。
这称为JavaScript闭包。 它使函数具有“私有”变量成为可能。
计数器受匿名函数作用域的保护,只能使用add函数进行更改。
注意闭包是即使父函数已关闭,也可以访问父作用域的函数。
解释还不错,但是有些事情还不清楚。 为什么最好使用自调用功能? 为什么嵌套匿名函数不是自调用函数? 当计数器内部已经返回了计数器时,为什么还要返回整个匿名函数呢?
闭包的概念可以解释为具有功能及其上下文。 上下文某种程度上是一种附加于函数的存储,用于解析捕获的变量(因此称为闭包?)。
执行示例代码时:
var add = (function () {
var counter = 0; // This is promoted to the below's function context
return function () {return counter += 1;}
})();
您创建一个上下文,将counter
变量提升为匿名函数上下文,从而可以从当前作用域访问该变量。
该图或多或少地解释了它:
在这种情况下,X和Y被函数上下文捕获,并被携带在该函数的所有执行中。
现在,这只是词汇环境的V8实现。
请参阅Vyacheslav Egorov有关使用V8的闭包实现的详细说明: 讨好V8闭包的乐趣(和收益?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.