【发布时间】:2014-06-17 20:50:36
【问题描述】:
我目前正在完成有关 JavaScript 的阅读。我在 http://www.w3schools.com/js/js_function_closures.asp 上关于 JavaScript 中的闭包(允许“私有变量”)的章节。
例子是一个计数器:
<!DOCTYPE html>
<html>
<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>
</html>
它声明它利用一个自调用函数将计数器设置为 0一次,并且每次 add() 迭代都会将计数器加一。但是,我在代码中看到用于自调用函数的花括号围绕counter = 0 和递增计数器的函数。我很难想象这两个命令究竟是如何在自调用函数中的,但是一个只运行一次,而另一个在每次迭代时都运行。
【问题讨论】:
-
IIFE(立即调用函数表达式)的声明返回另一个函数。因此,IIFE 的初始运行创建了
counter变量并返回一个对counter变量有效的函数。因此,当您调用add()时,您不是在运行var counter = 0代码,而是在运行 IIFE 的return(恰好是一个函数)。 -
counter += 1可以是++counter。
标签: javascript self-invoking-function