答案的第二部分我最近给了 https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function/5473193#5473193也回答这个问题。我不认为这与那一个重复,因此,为了方便起见,我将其粘贴到此处:
控制台对象不属于任何标准,而是文档对象模型的扩展。与其他 DOM 对象一样,它被视为宿主对象,不需要从 Object 继承,也不需要像本机 ECMAScript 函数和对象那样从 Function 继承其方法。这就是这些方法上 apply 和 call 未定义的原因。在 IE 9 中,大多数 DOM 对象都经过改进,可以从本机 ECMAScript 类型继承。由于开发人员工具被认为是 IE 的扩展(尽管是内置扩展),因此它们显然没有获得与 DOM 其余部分相同的改进。
无论如何,您仍然可以在控制台方法上使用一些 Function.prototype 方法,并使用一点 bind() 魔法:
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
这样你就可以修复所有的问题console
方法for IE 9以相同的方式:
if (Function.prototype.bind && window.console && typeof console.log == "object"){
[
"log","info","warn","error","assert","dir","clear","profile","profileEnd"
].forEach(function (method) {
console[method] = this.bind(console[method], console);
}, Function.prototype.call);
}
这会将“主机”函数替换为调用“主机”函数的本机函数。您可以通过包含以下兼容性实现来使其在 Internet Explorer 8 中工作:Function.prototype.bind https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/bind#Compatibility and Array.prototype.forEach https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach#Compatibility在您的代码中,或者重写上面的代码片段以合并这些方法所使用的技术。
See also
-
console.logtypeof 是“对象”而不是“函数” https://connect.microsoft.com/IE/feedback/details/585896/console-log-typeof-is-object-instead-of-function- Microsoft Connect(需要真实帐户)