【问题标题】:Abbreviating console.log in JavaScript [duplicate]在 JavaScript 中缩写 console.log [重复]
【发布时间】:2012-10-17 23:32:12
【问题描述】:

可能重复:
alias to chrome console.log

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

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

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

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

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

    这是一个使用bindconsole.log 预分配更多参数的示例:

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

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

    【讨论】:

    • +1 用于解释为什么,而不仅仅是如何
    • 这将不起作用
    • 感谢您的精彩解释!
    • 顺便说一句,在 ES6/ES7 中,您可以通过 ::console.log 将日志绑定到控制台。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是首选解决方案。
    • @TaylorMac 为什么?
    • let log = (...l) => console.log(...l); 在 es6 中保留多个变量。
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2014-12-14
    • 1970-01-01
    • 2012-09-23
    • 2012-07-09
    相关资源
    最近更新 更多