我有一个简单的日志函数:
function log(str) {
console.log('logged: ', str);
}
如果我调用它时不带括号(目前使用的是Chrome的开发工具),并传入一个模板字符串,如下所示:
log`foo`
输出为:logged: ["foo", raw: Array[1]]
如果我用括号来调用它,
log(`foo`)
输出为:logged: foo
为什么在Javascript中使用模板字符串而不使用括号来调用函数是可行的?是什么原因导致结果与使用括号调用结果不同?
发布于 2015-11-12 05:58:25
第一个示例(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)
时,最终只能得到结果字符串。没有对象,没有部件,没有原始值。
https://stackoverflow.com/questions/33660518
复制相似问题