24

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

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

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

log`foo`

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

如果我用括号调用它,

log(`foo`)

输出是:logged: foo

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

4

1 回答 1

31

第一个示例 ( log`foo`) 允许语言规范确定传递给 log 函数的值(参见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)

于 2015-11-11T21:58:24.563 回答