在 JavaScript 中调用函数的 Backticks (‘ ...’)

我不知道该怎么解释,但当我跑的时候

console.log`1`

在 google chrome 中,我得到的输出类似于

console.log`1`
VM12380:2 ["1", raw: Array[1]]

为什么反勾调用 log 函数,为什么它要创建 raw: Array[1]的索引?

Catgocat 在 JS 房间里提出了一个问题,但是除了一些关于 模板字符串的问题之外,没有任何答案是有意义的,这些问题并不真正符合为什么会发生这种情况。

28505 次浏览

这是所谓的标记模板在 ES-6更多可以阅读有关他们的 给你有趣的是,我发现了链接在星级部分的非常聊天。

但是代码的相关部分在下面(您基本上可以创建一个过滤的排序)。

function tag(strings, ...values) {
assert(strings[0] === 'a');
assert(strings[1] === 'b');
assert(values[0] === 42);
return 'whatever';
}
tag `a${ 42 }b`  // "whatever"

基本上,它只是用 console.log 函数标记“1”,就像它对任何其他函数所做的那样。标记函数分别接受模板字符串的解析值和可以执行进一步任务的值。

Babel 将上述代码翻译成

var _taggedTemplateLiteralLoose = function (strings, raw) { strings.raw = raw; return strings; };


console.log(_taggedTemplateLiteralLoose(["1"], ["1"]));

正如您在上面的示例中看到的,在被 babel 翻译之后,标记函数(console.log)正在传递以下 es6-> 5翻译代码的返回值。

_taggedTemplateLiteralLoose( ["1"], ["1"] );

该函数的返回值被传递给 console.log,然后该函数将打印数组。

标签模板字面意思:

以下语法:

function`your template ${foo}`;

叫做 带标签的模板文字。


作为标记模板文字调用的函数以下列方式接收其参数:

function taggedTemplate(strings, arg1, arg2, arg3, arg4) {
console.log(strings);
console.log(arg1, arg2, arg3, arg4);
}


taggedTemplate`a${1}b${2}c${3}`;

  1. 第一个参数是包含所有单个字符串字符的数组
  2. 剩下的参数与我们通过字符串插值得到的变量值相对应。注意在这个例子中没有 arg4的值(因为只有3次字符串插值) ,因此当我们尝试记录 arg4时,undefined会被记录下来

使用 rest 参数语法:

如果我们事先不知道字符串插值在模板字符串中会发生多少次,那么使用 rest 参数语法通常是有用的。此语法将函数接收到的其余参数存储到数组中。例如:

function taggedTemplate(strings, ...rest) {
console.log(rest);
}


taggedTemplate `a${1}b${2}c${3}`;
taggedTemplate `a${1}b${2}c${3}d${4}`;

参加聚会迟到了,但是,TBH,没有一个答案对原来问题(“为什么 raw: Array[1]”)的50% 作出解释

1. 为什么可以使用反勾来调用不带括号的函数?

console.log`1`

正如其他人指出的那样,这被称为 标记模板(更多细节也称为 给你)。

使用这种语法,函数将接收下列参数:

  • 第一个参数: 包含字符串中非表达式的不同部分的数组。
  • 其余的参数: 每个被插值的值(例如,那些是表达式)。

基本上,下面是“几乎”等价的 :

// Tagged Template
fn`My uncle ${uncleName} is ${uncleAge} years old!`
// function call
fn(["My uncle ", " is ", " years old!"], uncleName, uncleAge);

(见第二点,了解为什么它们不完全一样)

2. 为什么是 ["1", raw: Array[1]]

作为第一个参数传递的数组包含一个属性 raw,它允许在输入时使用 访问原始字符串(不处理转义序列)。

示例用例:

let fileName = "asdf";


fn`In the folder C:\Documents\Foo, create a new file ${fileName}`


function fn(a, ...rest) {
console.log(a); //In the folder C:DocumentsFoo, create a new file
console.log(a.raw); //In the folder C:\Documents\Foo, create a new file
}

什么,一个带有属性的数组?

是的,因为 JavaScript 数组实际上是对象,所以它们可以 储存物业

例如:

const arr = [1, 2, 3];
arr.property = "value";
console.log(arr); //[1, 2, 3, property: "value"]