为什么一个计数器起作用而另一个计数器不起作用? (关闭?)

时间:2018-11-27 17:48:47

标签: javascript

关于这个反例,我有两个问题。

  1. 为什么addVersionOne不起作用?为什么返回实际代码而不是数字?
  2. addVersionTwo如何工作?每次运行该功能时,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>

2 个答案:

答案 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;
};