为什么我不能重命名console.log?

sir*_*lot 5 javascript

这看起来应该非常简单:

var print = console.log;
print("something"); // Fails with Invalid Calling Object (IE) / Invalid Invocation (Chrome)
Run Code Online (Sandbox Code Playgroud)

为什么不起作用?

Esa*_*ija 17

因为你使用全局对象作为接收器调用方法,而该方法严格来说是非泛型的,并且只需要一个Console接收器实例.

泛型方法的一个例子是Array.prototype.push:

   var print = Array.prototype.push;
   print(3);
   console.log(window[0]) // 3
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

var print = function() {
     return console.log.apply( console, arguments );
};
Run Code Online (Sandbox Code Playgroud)

而ES5 .bind也提供了与上述相同的功能:

var print = console.log.bind( console );
Run Code Online (Sandbox Code Playgroud)