【问题标题】:Difference in count++ and count+1 in higher-order functions高阶函数中count++和count+1的区别
【发布时间】:2018-09-05 13:38:11
【问题描述】:

示例 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 ,那么为什么上面两个例子有区别。我知道它与关闭属性和提升有关。但是完全理解。你们能帮忙吗?

注意:如果没有意义,请告诉我是否应该更改问题的标题。

【问题讨论】:

  • count++count = count + 1 相同。
  • @JosephWebber 不,不是! (count = count + 1) 的值比count 的原始值大1。
  • @Pointy 对不起,我更新了示例 2,它应该是 count+1 而不是 count++
  • @JosephWebber 对不起,我更新了示例 2,它应该是 count+1 而不是 count++
  • @Pointy 我的错,你是对的。我没有想到++ 将在 count 被返回之后完成。

标签: javascript variables scope


【解决方案1】:

表达式count++ 求值count,加1,将结果存储在count,但整体结果(count++ 的净值)是@的原始值987654325@.

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

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

var inc = (count += 1);

真的没有办法(我能想到)在不使用函数的情况下干净地模仿count++,因为没有绕过对临时存储位置的需求:

var inc = () => { let tmp = count; count += 1; return tmp }();

后自增 ++ 的运算符语义可以追溯到 1970 年代甚至更早的 C 语言,并已被包括 JavaScript 在内的许多其他语言复制。民间传说(我记得,我是个老人)认为前自增和后自增运算符的灵感来自于 DEC PDP-11 指令集中可用的寻址模式,但在我看来,这总是不太可能。

【讨论】:

  • 嗨 Pointy 感谢您的回答。参考您的第一个语句,如果它加 1 并将结果存储在计数中,那么第一个警报返回的总体结果为什么仍然是 0?
  • @YoYo 因为这就是后增量运算符的工作方式。这意味着您想要变量 (count) 的 当前 值,但在检索到您希望变量递增之后。 count++ 的值在语言规范中定义为变量之前递增的值。
  • @YoYo 请注意,PHP 后自增运算符的工作方式完全相同。
【解决方案2】:

在您的第一个示例中,您正在发布递增,即在声明和使用之后添加 1。如果您使用 ++count(预递增),您将在警报中得到 1 和 2。

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

【讨论】:

  • 感谢 Ajay 的回答,在第一个示例中,由于它是单个语句,它应该增加 1,然后应该返回增加的值。为什么这没有发生?
  • @YoYo 虽然这不是正在发生的事情,但这是我刚开始时向我解释的方式。您返回的是增量本身,而不是增量的结果。
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 2015-12-16
  • 1970-01-01
  • 2011-02-22
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多