【问题标题】:why can't you do [array].forEach(console.log)为什么你不能做 [array].forEach(console.log)
【发布时间】:2015-03-10 21:16:22
【问题描述】:

暂时回到编写javascript,我想知道为什么这是不可能的

[array].forEach(console.log)

【问题讨论】:

标签: javascript


【解决方案1】:

它可以在某些浏览器中正常工作,而在其他浏览器中则不能。

Javascript 中的一个主要混淆点是this 的行为方式。通常这些会产生截然不同的行为:

myObj.method();

var a = myObj.method;
a();

你正在做的是将console.log 作为一个函数传递给forEach,这将它与它所附加的对象分开。这将导致在log 方法中对this 的任何使用都引用了错误的东西,并且很可能导致该方法无法正常工作。

要解决这个问题,您可以将thisArg 传递给.forEach

[array].forEach(console.log, console);

或使用.bind():

[array].forEach(console.log.bind(console));

【讨论】:

    【解决方案2】:

    因为console.log.bind(console),否则console 对象的.log() 方法会在错误的上下文中调用。

    要遵循的一般规则是:除非另有说明,否则必须在适当的上下文中调用该方法。

    所以在这种特殊情况下,没有人说它可以用undefined 来调用,所以你不应该期望它可以工作。即使是这样 - 你也不应该依赖它。

    【讨论】:

    • 谢谢,我一直认为如果它是对象上的方法,则提供上下文。
    【解决方案3】:

    如果浏览器支持它,你可以,尽管即使那样你也不应该依赖它。

    它在一些浏览器上不起作用的原因是传递这样的函数引用(即使该函数是console等对象的属性)不会设置this 上下文在该函数中正确。

    log 函数的(特定于浏览器的)实现尝试访问它的this 变量时,它发现它实际上指的是全局对象,而不是console

    要修复它,你可以使用这个:

    [array].forEach(console.log.bind(console));
    

    .bind 调用返回一个包装原始函数的新函数,其上下文设置为传递的参数(例如 console

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 2012-11-17
      • 2020-07-09
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多