带有模板文字但没有括号的 ES6 调用函数

ES6 calling function with template literal but no parentheses

根据 MDN,Tagged template literals 可以按如下方式使用:

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 时没有使用括号。

我希望它应该像 tag(`Hello`) 那样调用,但是它将模板文字产生的字符串作为函数的 strings 参数的参数传递。

调用不带括号但带参数的函数有什么特点?

What's this special feature of calling functions without parentheses?

标记模板的语法是 allowed by the the grammar:

MemberExpression : MemberExpression TemplateLiteral
CallExpression : CallExpression TemplateLiteral

这些规则意味着 MemberExpressionCallExpression 后跟 TemplateLiteral 被认为是函数调用。规范的附加说明:

A tagged template is a function call where the arguments of the call are derived from a TemplateLiteral (12.2.9). The actual arguments include a template object (12.2.9.3) and the values produced by evaluating the expressions embedded within the TemplateLiteral.

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

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

因此引入新语法似乎很有意义。


FWIW,这是 "ordinary" function calls:

的语法
CallExpression : MemberExpression Arguments
CallExpression : CallExpression Arguments