【问题标题】:Javascript ES5 Array functions. forEach second "This Value" argumentJavascript ES5 数组函数。 forEach second "This Value" 参数
【发布时间】:2017-05-30 13:41:05
【问题描述】:

我是 Javascript 的新手。我遇到了以下问题。

here 所述,几乎所有 ES5 数组函数(forEach、map、filter、every、some)都可以采用额外的第二个参数。

如果它指定函数被调用,就好像它是第二个参数的方法一样。也就是说,您传递的第二个参数成为您传递的函数内的 this 关键字的值。

array.forEach(function(currentValue, index, arr), thisValue)
array.map(function(currentValue, index, arr), thisValue)

相反:

array.reduce(callback, [initialValue])
array.reduceRight(callback, [initialValue])

请注意,reduce() 和 reduceRight() 都不接受可选参数,该参数指定要调用归约函数的 this 值。如果您需要将归约函数作为特定对象的方法调用,请参阅 Function.bind() 方法。

这是什么意思:“作为特定对象的方法被调用”?谁能提供一些示例它如何影响我的代码?

提前致谢。

【问题讨论】:

  • 作为 functional 语言的 javascript 重要特性之一是您可以将函数作为参数(又名,callbacks)传递给包装函数(又名, higher order function) 和这些回调的 context(aka, this 关键字) 很难推理,因为你永远不知道何时何地 (尽管很多时间由像 window 这样的全局对象拥有浏览器)它们将被调用,因此如果您在这些回调中使用 thisFunction.bind 是“固定”回调上下文的好方法,而 arrow function 自动绑定到封闭上下文。

标签: javascript arrays scope


【解决方案1】:

这很简单。在回调函数中,this 值将是传递给数组方法的第二个参数。如果你不会使用this,那么这个参数是无关紧要的,你不需要传递它。

"use strict";
[0].forEach(function(currentValue, index, arr) {
  console.log(this); // 1234
}, 1234);

请注意,在草率模式下,this 值将转换为对象。所以如果你省略参数或者使用undefined,你会得到全局对象。

如果您需要与reduce 类似的内容,请使用bind

"use strict";
[0, 1].reduce(function(prevValue, currValue, index, arr) {
  console.log(this); // 1234
}.bind(1234));

【讨论】:

  • 如果没有它,this 将是使用方法的上下文。如果直接在浏览器控制台中运行,就像window 一样
  • @Oriol 那么,我们为什么需要那个东西?为什么不直接执行以下[0,1].forEach(function(val, ind, ar) { let necessaryScope = this; }) 而没有任何bind 调用?
  • @IvanTalalaev 如果您使用函数表达式,它并没有多大用处。但是如果函数在其他地方定义,你可能需要传递一些this
  • @Oriol 我明白了,谢谢。这可能对箭头函数 () => {} 有用,因为 scope difference
  • @IvanTalalaev 是的,箭头函数没有 this 绑定,所以你得到的值与封闭上下文中的值相同。
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多