【问题标题】:Why can functions be called without parentheses when using template strings? [duplicate]为什么在使用模板字符串时可以不带括号调用函数? [复制]
【发布时间】:2016-02-13 03:10:50
【问题描述】:

我有一个简单的日志记录功能:

function log(str) {
  console.log('logged: ', str);
}

如果我在不带括号的情况下调用它(当前使用 Chrome 的开发工具)并传入一个模板字符串,如下所示:

log`foo`

输出为:logged: ["foo", raw: Array[1]]

如果我用括号来称呼它,

log(`foo`)

输出为:logged: foo

为什么在 Javascript 中使用无括号的模板字符串调用函数?发生了什么导致结果与用括号调用不同?

【问题讨论】:

    标签: javascript ecmascript-harmony template-strings ecmascript-6


    【解决方案1】:

    第一个示例 (log`foo`) 允许语言规范确定传递给日志函数的值(请参阅12.3.7)。第二个示例 (log(`foo`)) 显式传递了一个参数。

    模板文字可以包含字符串以及表达式。有时您可能希望从字符串部分和表达式部分对字符串的编译进行更多控制。在这种情况下,您可能正在寻找标记模板。

    var name = "Jonathan";
    var mssg = foo `Hello, ${name}. Nice name, ${name}.`;
    
    function foo ( strings, ...values ) {
        console.log( strings ); //["Hello, ", ". Nice name, ", ".", raw: Array[3]]
        console.log( values  ); //["Jonathan", "Jonathan"]
    }
    

    注意这里所有的字符串是如何通过第一个参数传入的。同样,所有的内插值表达式都通过其余参数传入(这里一起拉到一个数组中)。

    有了这个额外的控制,我们可以做各种各样的事情,比如本地化。在这个例子中,语言规范决定了传递给函数的适当值——开发者并没有决定这一点。

    相比之下,当您调用log(foo) 时,您最终会 得到结果字符串。没有对象,没有部分,没有原始值。

    【讨论】:

    • 值得添加一个链接,因为我以前没有听说过这个:developers.google.com/web/updates/2015/01/…
    • 我看到它在我正在审查的同事的代码中使用后遇到了这个问题。酷的东西。谢谢你的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2017-06-10
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多