[英]Why does one counter work and the other doesn't? (Closures?)
关于这个反例,我有两个问题。
counter
不会重置为0
吗? const addVersionOne = function() { let counter = 0; return function() { counter += 1; return counter; } } var addVersionTwo = (function () { let counter = 0; return function() { counter += 1; return counter; } })(); function writeVersionOne(){ document.getElementById("addVersionOne").innerHTML = addVersionOne(); } function writeVersionTwo(){ document.getElementById("addVersionTwo").innerHTML = addVersionTwo(); }
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <button type="button" onclick="writeVersionOne()">addVersionOne</button> <button type="button" onclick="writeVersionTwo()">addVersionTwo</button> <p id="addVersionOne">0</p> <p id="addVersionTwo">0</p> <script src="main.js"></script> </head> <body> </body> </html>
执行此命令时:
addVersionOne()
结果是什么? 好吧,让我们看看该函数返回什么:
//...
return function() {
counter += 1;
return counter;
}
它返回一个函数。 该函数从不执行,仅返回。 该函数本身被设置为目标元素的innerHTML
。
但是,这返回什么?
addVersionTwo()
请注意,第二个版本如何将所有内容包装在括号中,然后添加另一组括号以调用返回的函数。 因此,虽然变量addVersionOne
是返回函数的函数,但变量addVersionTwo
是返回的函数。 它返回一个值:
//...
return counter;
每次运行该功能时,计数器都不会重置为0吗?
您指的是哪个“功能”? 你有几个。 页面加载后 ,该函数将被执行一次 :
function () {
let counter = 0;
return function() {
counter += 1;
return counter;
}
}
然后,它返回一个存储在addVersionTwo
变量中的addVersionTwo
。 该函数是:
function() {
counter += 1;
return counter;
}
不,该函数不会在每次执行时将counter
重置为0
。
因为函数addVersionOne的返回值是一个函数,因此很明显。 但是addVersionTwo函数实际上是返回一个函数的函数调用的结果。 因此,addVersionTwo实际上是下面的函数:
return function() {
counter += 1;
return counter;
}
您可以如下定义函数addVersionTwo:
var counter = 0;
var addVersionTwo = function() {
counter += 1;
return counter;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.