为什么在使用模板字符串时可以不使用括号调用函数?

时间:2015-11-11 21:52:15

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

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

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

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

log`foo`

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

如果我用括号称呼它,

log(`foo`)

输出为:logged: foo

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

1 个答案:

答案 0 :(得分:26)

第一个示例(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)时,您最终只能获得 结果字符串。没有对象,没有零件,没有原始值。