模板文字和无括号的函数调用

cod*_*key 5 javascript ecmascript-6 template-literals tagged-templates

我最近了解到,当使用模板文字作为参数时,ES6 允许在没有括号的情况下进行函数调用。例如

showstring`Hello World`;
Run Code Online (Sandbox Code Playgroud)

但是,在阅读了有关此功能的几篇文章后,我对 JS 如何处理这些调用背后的逻辑知之甚少。

在玩弄了我的代码的一些排列之后,我仍然在努力拼凑模板文字在函数内部如何分解的模式,当人们以这种方式调用它时。

showstring`Hello World`;
Run Code Online (Sandbox Code Playgroud)

上面代码中发生的事情很简单,字符串文字作为数组接收,其中第一个也是唯一的元素是字符串。

一旦我开始在模板中使用表达式,就会有点令人困惑。例如

const showstring = (str) => {
  console.log(str);
}
showstring`Hello World`;
Run Code Online (Sandbox Code Playgroud)

所以看起来这...values部分破坏了所有的表达式。但是,为什么str数组在这些位置有空字符串呢?

我只是没有完全理解它在这里遵循的模式。有人可以解释一下这个功能吗?或者给我指点一篇好文章?

mar*_*ias 6

在第二个代码片段中,记录了这些:

// str
[
  "Hello World ",
  " ",
  " ",
  " and more"
]

// values
[
  "John",
  "John",
  3
]
Run Code Online (Sandbox Code Playgroud)

如果那些“空字符串”是指数组的第 2 项和第 3 项,则str它们不是空字符串;它们是带有单个空格的字符串。它们来自模板文字中表达式之间的空格:

showstring`Hello World ${name} ${name} ${1 + 2} and more`;
//                            ^       ^
Run Code Online (Sandbox Code Playgroud)

当模板文字前面有一个表达式时——在这种情况下showstring——它被称为标记模板

在您的showstring函数中,str始终包含比values数组多一项。例如,看看这些日志是什么:

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring``;
showstring`${name}`;
showstring`Hello ${name}!`;
Run Code Online (Sandbox Code Playgroud)

这不是特定于您的功能;这就是标记模板的工作方式。来自《不耐烦程序员的 JavaScript(ES2020 版)》一书中标记模板部分

第一个反引号之前的函数称为标记函数。它的论据是:

  • 模板字符串(第一个参数):带有围绕插值的文本片段的数组${}
  • 替换(剩余参数):内插值。

关于你的评论:

有趣的是,无论在调用函数时在表达式之间放置多少个空格,该单个空格将始终保持为单个空格。知道为什么它只修剪到一个空间吗?

情况似乎并非如此。这会记录一个包含三个空格的字符串:

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring`Hello ${name}   ${name}!`;
Run Code Online (Sandbox Code Playgroud)

您是否可能将结果打印到 DOM?除非您正在使用<pre>white-space: pre;类似的东西,否则多个空格仅显示为一个,因此结果似乎被修剪为一个空格。