【问题标题】:Javascript closure is not incrementing valueJavascript闭包不会增加价值
【发布时间】:2021-09-13 17:17:16
【问题描述】:
function setupCounter(val){
  console.log(val);
    return function counter(){
      console.log('counter func ', val);
        return val++;
      }
    }
debugger
let counter1 = setupCounter(0);
console.log(counter1()); //0
console.log(counter1()); //1

为什么第一个 counter1() 不增加值并返回 0。但第二个调用将值增加为 1,正如预期的那样:here is what I've been debuggin

【问题讨论】:

  • 使用return ++val
  • val++ vs ++val 我认为您对此感到困惑? val++ 首先返回值,然后递增它 - 而 ++val 先递增值然后返回它。如果您希望 (0) 返回 1 - 那么您需要先增加它然后返回它。
  • 理想情况下你会在第二种情况下得到 2,在第一种情况下因为关闭而得到 1。

标签: javascript lexical-closures


【解决方案1】:

这里的问题是后缀增量运算符不返回您所期望的。引用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment:

如果使用后缀,操作数后面有运算符(例如,x++),则 自增运算符递增并返回之前的值 递增。

如果使用前缀,操作数之前有运算符(例如,++x),则 递增运算符递增并返回之后的值 递增。

使用val++ 实际上会返回previous 值,而不是它变成的值。如果您希望它返回 new 值,您可以使用增量运算符作为前缀,例如:++val

由于这种常见的混淆,我更喜欢更冗长并做这样的事情:

val += 1;
return val;

【讨论】:

  • ++val 没有任何隐含意义。
猜你喜欢
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多