我正在尝试了解闭包并正在查看 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),并返回一个函数表达式。
这样 add 就变成了一个函数。“精彩”的部分是它可以访问父范围内的计数器。
这称为 JavaScript 闭包。它使函数可以具有“私有”变量。
计数器受匿名函数的作用域保护,只能使用 add 函数更改。
注意 闭包是一个可以访问父作用域的函数,即使在父函数关闭之后也是如此。
解释还不错,但有几件事不清楚。为什么自调用函数是最好用的?为什么嵌套匿名函数不是自调用函数?当计数器已经在其中返回时,为什么还要返回整个匿名函数?