7

根据 MDN,标记模板文字可以按如下方式使用:

var a = 5;
var b = 10;
function tag(strings, ...values) {
  alert(strings[0]); // "Hello "
  alert(strings[1]); // " world "
  alert(values[0]); // 15
  alert(values[1]); // 50
  return "Bazinga!";
}
tag `Hello ${ a + b } world ${ a * b }`; // "Bazinga!"

在上面的示例中,tag调用函数时不使用括号。

我希望它应该被称为 like tag(`Hello`),但是它将模板文字产生的字符串作为函数参数的参数传递strings

不带括号但带参数调用函数的这个特殊功能是什么?

4

1 回答 1

6

调用不带括号的函数的这个特殊功能是什么?

标记模板的这种语法只是语法允许的

MemberExpression : MemberExpression TemplateLiteral
CallExpression : CallExpression TemplateLiteral

这些规则意味着 aMemberExpressionCallExpression后跟 aTemplateLiteral被认为是一个函数调用。规范中的附加说明:

标记模板是一个函数调用,其中调用的参数派生自 TemplateLiteral ( 12.2.9 )。实际参数包括一个模板对象 ( 12.2.9.3 ) 和通过计算嵌入在 TemplateLiteral 中的表达式而产生的值。

如果你问为什么这样做,我不能给你答案。

但是,如果您考虑一下,就不可能只使用“普通”的函数调用语法。tag(`...`)意味着tag传递一个参数,即评估模板文字的结果。但正如您在 MDN 的示例中看到的那样,标记的模板函数实际上传递了多个参数。如果函数被传递一个模板文字而不是用不同的值调用,那么如果函数以不同的方式(内部)调用,那肯定会更令人惊讶。然后,如果您真的想将模板文字传递给函数,将如何调用它?

因此,引入新语法似乎是有意义的。


FWIW,这是“普通”函数调用的语法:

CallExpression : MemberExpression Arguments
CallExpression : CallExpression Arguments
于 2016-03-23T01:10:44.477 回答