为什么你不能[array] .forEach(console.log)

时间:2015-03-10 21:16:23

标签: javascript

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

[array].forEach(console.log)

3 个答案:

答案 0 :(得分:6)

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

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

所以在这种特殊情况下,没有人说可以用undefined调用它,所以你不应该期望它能够工作。即使它确实如此 - 你也不应该依赖它。

答案 1 :(得分:5)

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

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

myObj.method();

var a = myObj.method;
a();

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

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

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

或使用.bind()

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

答案 2 :(得分:2)

如果浏览器支持,您可以,尽管如此,您也不应该依赖它。

它不能在某些浏览器上工作的原因是传递这样的函数引用(即使该函数是console等对象的属性)也不会#39; t在该功能中正确设置this上下文。

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

要解决此问题,您可以使用:

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

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