值得指出的是,存在的console.log
实施行为上的差异。在节点v0.10.19下,您不会收到错误;你只看到这一点:
> [1,2,3,4,5].forEach(console.log);
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
这是因为回调forEach
是三个参数的函数取值,索引和数组本身。功能console.log
看到这三个参数并尽职尽责地记录它们。
在Chrome浏览器控制台,不过,你得到
> [1,2,3,4,5].forEach(console.log);
TypeError: Illegal invocation
在这种情况下,bind
将工作:
> [1,2,3,4,5].forEach(console.log.bind(console));
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
但有另一种方法:注意:第二个参数为forEach
取值this
用于回调:
> [1,2,3,4,5].forEach(console.log, console)
1 0 [ 1, 2, 3, 4, 5 ]
2 1 [ 1, 2, 3, 4, 5 ]
3 2 [ 1, 2, 3, 4, 5 ]
4 3 [ 1, 2, 3, 4, 5 ]
5 4 [ 1, 2, 3, 4, 5 ]
其在Chrome的控制台和节点对我的作品。当然,我敢肯定,你想要什么仅仅是价值观,所以恐怕最好的解决办法是,确实是:
> [1,2,3,4,5].forEach(function (e) {console.log(e)});
1
2
3
4
5
无论节点的行为是一个错误,或者是根本没有的优势事实上console.log
不是由ECMA规定的是在自己的权利有趣。但不同的行为,你必须要知道你的回调是否使用this
是重要的,意味着我们必须回落到直接编码,即使是冗长感谢关键字function
的事实。
你有错误的'this'。 – SLaks 2012-03-09 18:32:04
确实。将自己回答,我是一个白痴 – 2012-03-09 18:35:48
它可以被删除吗?这不是真的那么有用=/ – 2012-03-09 18:38:02