【问题标题】:Template literals and parentheses-less function calls模板文字和无括号函数调用
【发布时间】:2021-04-21 03:42:21
【问题描述】:

我最近了解到 ES6 允许在使用模板文字作为参数时进行不带括号的函数调用。例如

showstring`Hello World`;

然而,在阅读了几篇关于此功能的文章后,我发现关于 JS 如何处理这些调用背后的逻辑的信息很少。

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

const showstring = (str) => {
  console.log(str);
}
showstring`Hello World`;

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

一旦我开始在模板中使用表达式,就会有点混乱。例如

const showstring = (str, ...values) => {
  console.log(str);
  console.log(values)
}
const name = 'John'
showstring`Hello World ${name} ${name} ${1 + 2} and more`;

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

我只是没有完全掌握它遵循的模式。有人可以解释这个功能吗?或者也许给我指出一篇好文章?

【问题讨论】:

    标签: javascript ecmascript-6 template-literals tagged-templates


    【解决方案1】:

    在第二个代码 sn-p 中,记录了这些:

    // str
    [
      "Hello World ",
      " ",
      " ",
      " and more"
    ]
    
    // values
    [
      "John",
      "John",
      3
    ]
    

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

    showstring`Hello World ${name} ${name} ${1 + 2} and more`;
    //                            ^       ^
    

    当模板文字前面有一个表达式(在本例中为 showstring)时,它被称为 tagged template

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

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

    这不是特定于您的功能;这就是标记模板的工作方式。来自Tagged templates section in the book JavaScript for impatient programmers (ES2020 edition)

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

    • 模板字符串(第一个参数):一个数组,其中包含围绕插值的文本片段${}
    • Substitutions(剩余参数):插值。

    关于您的评论:

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

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

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

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

    【讨论】:

    • 但有趣的是,无论您在调用函数时在表达式之间放置了多少空格,该单个空格都将始终保持为单个空格。知道为什么它只修剪一个空格吗?
    • @codemonkey 这似乎并非如此。我更新了我的答案。
    • 大崩溃。事实上,我使用 playcode.io 来测试多空间场景,我毫不怀疑这是因为它如何将结果打印到 DOM。好点子。
    • 你能建议这个功能的任何巧妙用途吗?虽然很有趣,但对我来说似乎完全是多余的。
    • @codemonkey 检查我的答案中的第二个链接(书籍章节),它有一些示例以及有关模板文字和标记模板的更多信息。另见例如Awesome Tagged Templatescommon-tags.
    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 2015-10-01
    • 2021-01-06
    • 2020-10-23
    • 1970-01-01
    • 2010-10-10
    • 2012-04-27
    • 2011-03-20
    相关资源
    最近更新 更多