为什么JavaScript闭包不能正确使用双括号?

时间:2019-02-20 20:35:01

标签: javascript

当我使用双括号时,此代码返回1

count

但是此代码返回3。

ungroup

为什么会这样?

3 个答案:

答案 0 :(得分:2)

第一个示例运行a 三个不同的时间,因此第二次或第三次执行a不会影响其他{{ 1}}。

但是,在第二个示例中,您正在将a分配给y 单次调用返回的函数,该函数设置关闭。因此,现在a拥有对y中使用的x变量的引用。第二次调用a,然后第三次调用,使用的是与第一次y调用相同的单一作用域,因此在整个代码中使用相同的a值。最后,由于您两次调用x,因此同一y会递增3次,结果是x

答案 1 :(得分:2)

在代码中添加一些调试信息可以帮助您了解正在执行的操作。在第一个示例中,您正在调用方法a(初始化变量x),然后调用它返回的函数(此模式执行3次):

function a()
{
  let x = 0;
  console.log("Initializing x to 0!");
  return function b()
  {
    x = x + 1;
    console.log("Incrementing x, x now is: " + x);
    return x;
  }
}
a()();
a()();
console.log(a()());

在第二个示例中,您一次调用方法a,然后对它返回的函数进行了多次调用,因此x被多次递增:

function a()
{
  let x = 0;
  console.log("Initializing x to 0!");
  return function b()
  {
    x = x + 1;
    console.log("Incrementing x, x now is: " + x);
    return x;
  }
}

let y = a();
y();
y();
console.log(y());

此外,您可以在此处找到更多详细信息:Closures,这可以帮助您理解这一点。

答案 2 :(得分:0)

您的第一个示例与此相同:

// a()();
x = 0; x = x + 1;
//a()();
x = 0; x = x + 1;
//console.log(a()());
x = 0; x = x + 1; console.log(x);

您的第二个示例正在执行此操作:

//let y = a();
x = 0;
//y();
x = x + 1;
//y();
x = x + 1;
//console.log(y());
x = x + 1; console.log(x);