在JavaScript中缩写console.log

Laj*_*agy 23 javascript

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

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

var log = console.log;
log("Bingo");  // Uncaught TypeError: Illegal invocation
Run Code Online (Sandbox Code Playgroud)

我应该使用apply()吗?但那时我必须传递论据,对吗?

zne*_*eak 74

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

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

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

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

以下是使用bind预先分配更多参数的示例console.log:

var debugLog = console.log.bind(console, "DEBUG:");
Run Code Online (Sandbox Code Playgroud)

调用debugLog将为日志消息添加前缀DEBUG:.

  • +1解释**为什么**,而不仅仅**如何**. (10认同)
  • 顺便说一句,使用ES6/ES7,您将能够执行`:: console.log`以将日志绑定到控制台. (2认同)

Ibu*_*Ibu 15

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

var log = function (l) {
   console.log(l);
}
Run Code Online (Sandbox Code Playgroud)

但请注意,console.log可以使用无限数量的参数,因此适当的方法是这样做:

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