7

在 IE9 中打开开发人员工具后,此代码有效:

var log = Function.prototype.bind(console.log, console);

但是如果我输入

console.log(console, console.log);
var log = console.log.bind(console);

然后我得到这个:

SCRIPT438:对象不支持属性或方法“绑定”

为什么 ?

这是已知的 IE 错误还是正常行为?

它会影响其他功能吗(我对它window.alert也是原生的没有问题)?

4

2 回答 2

9

正如相关答案所说,这仅仅是因为 IE 中对象的log函数console不继承自Function. 它是一个宿主对象,它使用 IE 认为合适的任何规则。

但它是一个函数式的。这就是为什么使用Function.prototype.bind作品,就像Array.prototype.forEach在类数组对象上使用作品一样。(提示:NodeLists 和 HTMLCollections。)

这本身不是一个错误,因为没有关于该console对象的规范。DOM 生活标准甚至没有提到它。所以每个浏览器都以它想要的方式实现这个对象。

这确实意味着该window.alert功能会遇到同样的问题。我们很幸运,它在浏览器中运行良好。

那就是IE。处理它。尽管 IE9 比 IE8 好得多,但它仍然比其他现代浏览器差很多。

于 2013-01-09T10:55:27.687 回答
5

console 是 DOM 的扩展,它不是 ECMAScript 的一部分。由于它是一个宿主对象,因此不需要从“对象”继承。在 IE (9 & 8) 中,控制台仅在开发人员工具栏打开时才会显示。

var log = Function.prototype.bind.call(console.log, console); 
log(60+90);//150
于 2013-01-09T10:59:11.957 回答