当我使用双括号时,此代码返回1
count
但是此代码返回3。
ungroup
为什么会这样?
答案 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);