我可能在问一个愚蠢的问题。但是我是初学者。
在有关高阶函数的章节中,我用雄辩的JavaScript看到了这个示例。
有一个带有2个参数的重复函数。 1.我们想要重复的次数 2.我们要重复的动作
当console.log作为2 nd 参数代码传递时,效果很好。它产生完美的输出。
但是当array.push作为2 nd 参数代码传递时抛出错误,我们需要传递一个函数作为2 nd 参数使array.push工作
请帮助理解这个概念。
//code here works...
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
repeat(3, console.log);
//so why code below does not work...?
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
let labels = [];
repeat(5, labels.push);
console.log(labels);
/*
In my understanding labels.push is also a function just like console.log, so it should push i 5 times(i.e 0-4) into labels array.
Please help me where am I wrong.
*/
//Why we require to pass a function as described below.
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
let labels = [];
repeat(5, i => labels.push(i));
console.log(labels);
答案 0 :(得分:0)
这是因为labels.push需要上下文。
如果您执行repeat(5, labels.push.bind(labels))
,将会看到它起作用。
我留给您阅读有关fn.call(),fn.bind()和fn.apply()的内容。
答案 1 :(得分:0)
执行repeat(5, labels.push.bind(labels))
可行,但阅读起来很糟糕。请改用箭头功能i => labels.push(i)
,因为它更容易阅读很多。
console.log
是全局范围的,因此函数可以访问它。 labels.push
不在repeat
的范围内,因此repeat
无法访问它。如果您想了解箭头功能的工作原理,This page非常有用