在IE9中打开开发人员工具,此代码有效:
var log = Function.prototype.bind(console.log, console);
但如果我输入
console.log(console, console.log);
var log = console.log.bind(console);
然后我明白了:
为什么?
这是一个已知的IE错误还是正常行为?
它是否会影响其他功能(我对window.alert
也没有问题也是原生的)?
答案 0 :(得分:9)
正如相关答案所说,这只是因为IE中log
对象的console
函数不会从Function
继承。它是一个宿主对象,它使用IE认为适合的任何规则。
但这是一个功能。这就是使用Function.prototype.bind
工作的原因,就像使用Array.prototype.forEach
在类似数组的对象上工作一样。 (提示:NodeLists和HTMLCollections。)
这本身并不是一个错误,因为没有关于console
对象的说明。 DOM living standard甚至没有提到它。所以每个浏览器都按照它想要的方式实现这个对象。
这确实意味着window.alert
函数会遇到同样的问题。我们很幸运,它在浏览器中运行良好。
那是IE。处理它。虽然IE9远比IE8好,但它仍然比其他现代浏览器更差。
答案 1 :(得分:5)
console是DOM的扩展,它不是ECMAScript的一部分。由于它是一个宿主对象,因此不需要从'Object'继承。在IE(9& 8)中,只有在打开开发人员工具栏时才会显示控制台。
var log = Function.prototype.bind.call(console.log, console);
log(60+90);//150