我正在尝试了解闭包,并且正在查看 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),并返回一个函数表达式。
这样add就变成了一个函数。 “精彩”之处在于它可以
访问父作用域中的计数器。
这称为 JavaScript 闭包。它使得有可能
函数具有“私有”变量。
计数器受匿名函数范围的保护,并且
只能使用添加功能进行更改。
Note闭包是一个可以访问父作用域的函数,甚至
父函数关闭后。
解释还不错,但有些事情不清楚。为什么自调用函数是最好的选择?为什么嵌套匿名函数不是自调用函数?当计数器已经返回内部时,为什么必须返回整个匿名函数?
闭包的概念可以解释为具有函数及其上下文。上下文在某种程度上是一种附加到函数上的存储,用于解析捕获的变量(因此称为闭包?)。
执行示例代码时:
var add = (function () {
var counter = 0; // This is promoted to the below's function context
return function () {return counter += 1;}
})();
您创建一个上下文,其中counter
变量被提升到匿名函数上下文,因此您可以从当前范围访问该变量。
这张图或多或少地解释了这一点:
在这种情况下,X 和 Y 由函数上下文捕获,并在该函数的所有执行中进行。
现在,这只是 V8 实现词汇环境 http://es5.github.io/#x10.2.
请参阅 Vyacheslav Egorov 关于使用 V8 实现闭包的精彩解释:Grokking V8 关闭是为了乐趣(和利润?) http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)