27

可能重复:
chrome console.log 的别名

这真的很愚蠢,但我不能缩写console.log(我正在使用Chrome)。这是我天真的尝试:

var log = console.log;
log("Bingo");  // Uncaught TypeError: Illegal invocation

我应该使用 apply() 吗?但是我必须传递论点,对吗?

4

2 回答 2

78

这会失败,因为对 Javascript 方法的引用不包括对对象本身的引用。将方法分配给console.log变量并将调用应用于 的一种简单而正确的方法console是在bind方法上使用方法,并作为参数log传递:console

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

每个方法都有一个隐藏的this参数,并且由于可以说是糟糕的语言设计,当您获得对方法的引用时,它并没有关闭。该bind方法的目的是为函数预先分配参数,并返回一个函数,该函数接受函数所期望的其余参数。的第一个参数bind应该始终是this参数,但您实际上可以使用它分配任意数量的参数。

Usingbind具有显着的优势,即您不会失去该方法接受更多参数的能力。例如,console.log实际上可以接受任意数量的参数,并且它们都将连接在一个日志行上。

下面是一个使用bind为 预分配更多参数的示例console.log

var debugLog = console.log.bind(console, "DEBUG:");

调用debugLog将在日志消息前加上DEBUG:.

于 2012-10-17T23:39:42.983 回答
16

简单的方法是将其包装在一个函数中:

var log = function (l) {
   console.log(l);
}

但请注意,console.log 可以接受无限数量的参数,因此适当的方法是:

var l = function () {
   console.log.apply(console, arguments);
}
于 2012-10-17T23:34:23.793 回答