如何在PhantomJS中处理`console.log.bind(console)`抛出错误?

时间:2015-12-02 15:18:11

标签: javascript phantomjs

使用PhantomJS 1.9.x,我想在我的代码中使用console.log.bind(console),但由于console.log.bindundefined而导致错误(console.error.bind(console)等相同) )

PhantomJS 1.x的一个已知问题是它不支持Function.prototype.bind

然而即使包括bind polyfill之后,事情也无法正常工作:

 console.log(Function.prototype.bind);
 // function bind(obj) { ... }
 console.log(console.log.bind);
 // undefined

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

似乎在PhantomJS中,console有点特别,因为它不是Function的实例(与Chrome或Firefox相反)。因此,Function.prototype延伸对此没有任何作用。

console.log(typeof console.log === "function");
// true
console.log(console.log instanceof Function);
// false

(可能console.log来自不同的JavaScript上下文,此问题与myArray instanceof Arrayfalse来自iframe时评估myArray时的问题相同

要解决此问题,除了包含Function.prototype.bind的填充之外,您还可以手动为bind方法分配console,如下所示:

if (!console.log.bind) {
    // PhantomJS quirk
    console.log.constructor.prototype.bind = Function.prototype.bind;
}

在此之后,所有控制台方法都将具有.bind()

console.log(console.log.bind);   // function bind(obj) { ... }
console.log(console.info.bind);  // function bind(obj) { ... }
console.log(console.debug.bind); // function bind(obj) { ... }
console.log(console.warn.bind);  // function bind(obj) { ... }
console.log(console.error.bind); // function bind(obj) { ... }