我知道您可以使用模板文字来提供方法的第一个参数,例如:
const f = x => "hello ," + x;
f`world` // returns 'hello, world'
所以我可以以某种方式理解为什么这段代码有效:
String.raw`bla bla`
但是,我似乎无法理解为什么带括号的相同方法调用会引发错误:
String.raw(`bla bla`)
投掷次数:Uncaught TypeError: Cannot convert undefined or null to object
我的问题是:
为什么第一个代码段有效? 为什么我可以在方法调用中用模板文字替换括号?
为什么
String.raw
只有在这样称呼时才有效?
...我似乎不明白为什么带括号的相同方法调用会引发错误
这不是同一个方法调用。
这:
String.raw`bla blah`
。调用raw
传入模板。
但是这个:
String.raw(`bla blah`)
。处理模板,创建一个字符串,然后使用该字符串调用raw
。就像你写的那样:
const str = `bla blah`;
String.raw(str);
。但没有常数。
这根本不是一回事。
为什么第一个片段有效?
因为这就是标记模板文本的工作方式。他们是他们自己的事情。
为什么
String.raw
只有在这样称呼时才有效?
因为它被设计为作为标记函数运行,但你像非标记函数一样调用它,而不是将标记函数作为标记函数调用时接收的信息传递给它。
如果您看到标记函数接收的内容,可能会有所帮助:
function foo(strings, ...tokenValues) {
console.log("strings: ", JSON.stringify(strings));
console.log("strings.raw: ", JSON.stringify(strings.raw));
console.log("Token values (" + tokenValues.length + "):");
tokenValues.forEach((val, index) => {
console.log(`${index}: ${typeof val}: ${JSON.stringify(val)}`);
});
}
const token = "tokenValue";
const obj = {
foo: "bar",
num: Math.random()
};
foo`bla nbla ${token} bla ${obj} done`;
请注意该函数如何接收包含模板的非标记部分("字符串")的数组,后跟带有每个标记值的参数。另请注意,这些值是实际值,而不是值的字符串。
有关模板文本和标记函数的更多信息:
- 多核
- 探索 ES6:模板文字
或者如果你想调用 String.raw作为一个函数,你需要像这样调用它
String.raw({raw: `xyx`})
如 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw 文档中所述
调用字符串的两种方式.raw
String.raw(callSite, ...substitutions)
String.raw`templateString`