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

时间:2016-03-23 00:41:51

标签: javascript ecmascript-6 tagged-templates

根据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参数的参数传递。

调用没有括号的函数但使用参数?

的特殊功能是什么

1 个答案:

答案 0 :(得分:6)

  

在没有括号的情况下调用函数的这个特殊功能是什么?

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

MemberExpression : MemberExpression TemplateLiteral
CallExpression : CallExpression TemplateLiteral

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

  

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

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

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

因此,引入新语法似乎是有道理的。

FWIW,这是"ordinary" function calls的语法:

CallExpression : MemberExpression Arguments
CallExpression : CallExpression Arguments