带有字符串的 String.raw 只能在没有括号的情况下工作

Eli*_*'er 2 javascript ecmascript-6

我知道您可以使用模板文字来提供方法的第一个参数,例如:

const f = x => "hello ," + x;
f`world` // returns 'hello, world'
Run Code Online (Sandbox Code Playgroud)

所以我可以以某种方式理解为什么这段代码有效:

String.raw`bla bla`
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法理解为什么带括号的相同方法调用会引发错误:

String.raw(`bla bla`)
Run Code Online (Sandbox Code Playgroud)

抛出: Uncaught TypeError: Cannot convert undefined or null to object

我的问题是:

  • 为什么第一个片段有效?为什么我可以在方法调用中用模板文字替换括号?

  • 为什么String.raw只有在以这种方式调用时才有效?

T.J*_*der 5

...我似乎无法理解为什么带括号的相同方法调用会引发错误

这不是同一个方法调用。

这个:

String.raw`bla blah`
Run Code Online (Sandbox Code Playgroud)

...调用raw传入模板

但是这个:

String.raw(`bla blah`)
Run Code Online (Sandbox Code Playgroud)

...处理模板,创建一个字符串,然后raw使用该字符串调用。就像你写的一样:

const str = `bla blah`;
String.raw(str);
Run Code Online (Sandbox Code Playgroud)

...但没有常数。

这根本不是一回事。

为什么第一个片段有效?

因为这就是标记模板文字的工作方式。他们是他们自己的东西。

为什么String.raw只有在以这种方式调用时才有效?

因为它被设计为作为标记函数运行,但是您像非标记函数一样调用它,而不是将标记函数作为标记函数调用时接收到的信息传递给它。

如果您看到标记函数接收到的内容,可能会有所帮助:

请注意该函数如何接收一个包含模板的非标记部分(“字符串”)的数组,后跟带有每个标记值的参数。另请注意,这些值是实际值,而不是值的字符串。

有关模板文字和标签函数的更多信息: