【发布时间】:2015-03-10 21:16:22
【问题描述】:
暂时回到编写javascript,我想知道为什么这是不可能的
[array].forEach(console.log)
【问题讨论】:
-
array的值是多少 -
只要定义了
array,您就可以这样做(只是在 Firebug 中做到了)。你只是没有得到你所期望的吗?你期待什么?
标签: javascript
暂时回到编写javascript,我想知道为什么这是不可能的
[array].forEach(console.log)
【问题讨论】:
array的值是多少
array,您就可以这样做(只是在 Firebug 中做到了)。你只是没有得到你所期望的吗?你期待什么?
标签: javascript
它可以在某些浏览器中正常工作,而在其他浏览器中则不能。
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));
【讨论】:
因为console.log.bind(console),否则console 对象的.log() 方法会在错误的上下文中调用。
要遵循的一般规则是:除非另有说明,否则必须在适当的上下文中调用该方法。
所以在这种特殊情况下,没有人说它可以用undefined 来调用,所以你不应该期望它可以工作。即使是这样 - 你也不应该依赖它。
【讨论】:
如果浏览器支持它,你可以,尽管即使那样你也不应该依赖它。
它在一些浏览器上不起作用的原因是传递这样的函数引用(即使该函数是console等对象的属性)不会设置this 上下文在该函数中正确。
当log 函数的(特定于浏览器的)实现尝试访问它的this 变量时,它发现它实际上指的是全局对象,而不是console。
要修复它,你可以使用这个:
[array].forEach(console.log.bind(console));
.bind 调用返回一个包装原始函数的新函数,其上下文设置为传递的参数(例如 console)
【讨论】: