当console.log作为参数传递时,它起作用,但是当array.push被传递参数时,它不起作用,为什么?

时间:2019-08-08 14:32:31

标签: javascript higher-order-functions array-push

我可能在问一个愚蠢的问题。但是我是初学者。

在有关高阶函数的章节中,我用雄辩的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);

2 个答案:

答案 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非常有用