关于这个反例,我有两个问题。
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>
答案 0 :(得分:1)
执行此操作时:
addVersionOne()
结果如何?好吧,让我们看看该函数返回什么:
//...
return function() {
counter += 1;
return counter;
}
它返回一个函数。该函数从不执行,仅返回。该函数本身已设置为目标元素的innerHTML
。
但是这会返回什么?:
addVersionTwo()
请注意第二个版本如何将所有内容包装在括号中,然后添加另一组括号以调用返回的函数。因此,尽管变量addVersionOne
是返回函数的函数,变量addVersionTwo
是返回的函数。然后 it 返回一个值:
//...
return counter;
是否在每次运行该功能时将计数器重置为0?
您指的是什么“功能”?你有几个。页面加载后,该函数将一次执行:
function () {
let counter = 0;
return function() {
counter += 1;
return counter;
}
}
然后返回一个存储在addVersionTwo
变量中的函数。 那个函数是:
function() {
counter += 1;
return counter;
}
不,该函数不会在每次执行时将counter
重置为0
。
答案 1 :(得分:0)
因为函数addVersionOne的返回值是一个函数,因此很明显。但是addVersionTwo函数实际上是返回一个函数的函数调用的结果。因此,addVersionTwo实际上是下面的函数:
return function() {
counter += 1;
return counter;
}
您可以如下定义函数addVersionTwo:
var counter = 0;
var addVersionTwo = function() {
counter += 1;
return counter;
};