console.log([1 , 2, 3 , 4 , 5].map((acc = 0 , num => acc += num))); // output : [1, 3, 6, 10, 15]
我知道闭包已经被应用到这段代码中,但是不知道它是如何一步一步地工作的--我想把它形象化。我们知道该Map具有以下签名:
array.map(function(currentValue, index, arr), thisValue)
有了这个,谁能给我解释一下上面的代码?
zwghvu4y1#
从技术上讲,这是创建一个闭包,但关键部分是声明一个全局变量acc(除非acc已经存在于当前作用域中),用值0初始化它,然后在匿名arrow函数中使用它,通过使用grouping operator和comma operator,这是内联完成的。
acc
0
console.log([1 , 2, 3 , 4 , 5].map((acc = 0 , num => acc += num))); // output : [1, 3, 6, 10, 15] console.log(acc, window.acc); // acc exists globally
它相当于:
acc = 0; console.log([1 , 2, 3 , 4 , 5].map(num => acc += num)); // output : [1, 3, 6, 10, 15] console.log(acc, window.acc); // acc exists globally
注意,在strict mode中,除非之前声明了变量,否则程序将失败。
"use strict"; console.log([1 , 2, 3 , 4 , 5].map((acc = 0 , num => acc += num))); // output : ReferenceError: Can't find variable: acc console.log(acc, window.acc); // acc doesn't exist because program exits
"use strict"; let acc; console.log([1 , 2, 3 , 4 , 5].map((acc = 0 , num => acc += num))); // output : [1, 3, 6, 10, 15] console.log(acc, window.acc); // acc doesn't exist globally, but it does locally
1条答案
按热度按时间zwghvu4y1#
从技术上讲,这是创建一个闭包,但关键部分是声明一个全局变量
acc
(除非acc
已经存在于当前作用域中),用值0
初始化它,然后在匿名arrow函数中使用它,通过使用grouping operator和comma operator,这是内联完成的。它相当于:
注意,在strict mode中,除非之前声明了变量,否则程序将失败。