高阶函数中count ++和count + 1的差异

时间:2018-09-05 13:38:11

标签: javascript variables scope

  

示例1

function makeCounter() {
      let count = 0;

      return function() {
        return count++;
      };
    }

    let counter = makeCounter();

    alert( counter() ); 
    alert( counter() );

分别高于警报0和1。


  

示例2

function makeCounter() {
  let count = 0;

  return function() {
    return count+1;
  };
}

let counter = makeCounter();

alert( counter() ); 
alert( counter() ); 

这将分别提醒1和1

在编程中,count ++等同于count + 1,那么为什么上面两个示例有所不同。我知道它与关闭属性和吊装有关。但是完全理解。你们能帮忙吗?

注意:如果问题没有道理,请让我知道是否应该更改标题。

2 个答案:

答案 0 :(得分:6)

表达式count++的计算结果为count,加1,将结果存储在count中,但是总结果(count++的净值)为 {}的原始值。

表达式count计算count + 1,加1,然后返回结果。 count的值不变。

有趣的是,虽然可以使用替代表达式模仿count(预递增)

++count

实际上(我能想到)没有使用函数就干净地模仿var inc = (count += 1); 的方法,因为没有必要解决临时存储位置的问题:

count++

后递增var inc = () => { let tmp = count; count += 1; return tmp }(); 的运算符语义可追溯到1970年代(可能更早)的C语言,并已被许多其他语言(包括JavaScript)复制。民俗学(我记得是个老人)认为,增量前和增量后运算符的灵感来自DEC PDP-11指令集中可用的寻址模式,但在我看来这似乎一直不太可能。

答案 1 :(得分:3)

在您的第一个示例中,您要进行帖子递增,即在声明和使用后加1。如果您使用++ count(预递增),则警报中将得到1和2。

在第二个示例中,您没有将count + 1的值存储回count中,因此第二次,count仍然为0,并且您再次获得相同的结果。