需要更多关于w3schools javascript封面示例的解释

时间:2016-02-26 18:07:00

标签: javascript closures anonymous-function self-invoking-function

我正在尝试了解闭包,正在查看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闭包。这使得它成为可能   函数有“私有”变量。

     

计数器受匿名函数范围的保护,并且   只能使用添加功能进行更改。

     

注意闭包是一种可以访问父作用域的函数   在父函数关闭之后。

解释并不错,但有些事情尚不清楚。为什么自我调用函数最好用?为什么嵌套的匿名函数不是自调用函数?当计数器已在其中返回时,为什么还必须返回整个匿名函数?

1 个答案:

答案 0 :(得分:1)

闭包的概念可以解释为具有功能及其背景。上下文在某种程度上是附加到函数的存储,用于解析捕获的变量(因此命名为closure?)。

执行示例代码时:

var add = (function () {
    var counter = 0; // This is promoted to the below's function context
    return function () {return counter += 1;}
})();

您创建了一个上下文,其中counter变量被提升为匿名函数上下文,因此您可以从当前范围访问该变量。

这个图表或多或少地解释了它:

JS Functions and Context

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

现在,这只是lexical environments的V8实现。

请参阅Vyacheslav Egorov关于使用V8的闭包实现的很好解释:Grokking V8 closures for fun (and profit?)