console.log.apply 在 IE9 中不起作用

2023-12-28

看起来我已经重新发明了轮子,但不知怎的,这在 Internet Explorer 9 中不起作用,但在 IE6 中却起作用。

function debug()
  if(!window.console) { 
    window.console = { log: function() { /* do something */ } };
  }
  console.log.apply(console, arguments);
}

有关的:javascript 的 Apply() 问题 https://stackoverflow.com/questions/4638450/apply-question-for-javascript

F12 调试器告诉我这个“对象”(console.log)不支持方法“apply”。 它甚至不被认为是一个函数吗? 还有其他指示或想法吗?


答案的第二部分我最近给了 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(需要真实帐户)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

console.log.apply 在 IE9 中不起作用 的相关文章