根据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
参数的参数传递。
调用没有括号的函数但使用参数?
的特殊功能是什么答案 0 :(得分:6)
在没有括号的情况下调用函数的这个特殊功能是什么?
标记模板的语法只是allowed by the the grammar:
MemberExpression : MemberExpression TemplateLiteral
CallExpression : CallExpression TemplateLiteral
这些规则意味着MemberExpression
或CallExpression
后跟TemplateLiteral
被视为函数调用。该规范的附加说明:
标记模板是一个函数调用,其中调用的参数派生自TemplateLiteral(12.2.9)。实际参数包括模板对象(12.2.9.3)以及通过评估嵌入在TemplateLiteral中的表达式而生成的值。
如果你问为什么这样做,我不能给你一个答案。
然而,如果你考虑一下,那么就不能使用"普通"函数调用语法。 tag(`...`)
表示tag
传递一个参数,即评估模板文字的结果。但正如您在MDN的示例中所看到的,标记模板函数实际上传递了多个参数。如果函数以不同的方式(内部)调用,如果它们被传递给模板文字而不是被调用不同的值,那肯定会更令人惊讶。然后,如果你真的想要将模板文字传递给它,如何调用函数?
因此,引入新语法似乎是有道理的。
FWIW,这是"ordinary" function calls的语法:
CallExpression : MemberExpression Arguments
CallExpression : CallExpression Arguments