繁体   English   中英

需要更多有关w3schools javascript封闭示例的解释

[英]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变量提升为匿名函数上下文,从而可以从当前作用域访问该变量。

该图或多或少地解释了它:

JS函数和上下文

在这种情况下,X和Y被函数上下文捕获,并被携带在该函数的所有执行中。

现在,这只是词汇环境的V8实现。

请参阅Vyacheslav Egorov有关使用V8的闭包实现的详细说明: 讨好V8闭包的乐趣(和收益?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM