暂时回到写javascript,我想知道为什么这是不可能的
[array].forEach(console.log)
答案 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
)