Javascript 带字符串的String.raw仅适用于不带括号的情况
我知道您可以使用模板文字来提供方法的第一个参数,例如:Javascript 带字符串的String.raw仅适用于不带括号的情况,javascript,ecmascript-6,Javascript,Ecmascript 6,我知道您可以使用模板文字来提供方法的第一个参数,例如: const f = x => "hello ," + x; f`world` // returns 'hello, world' 所以我可以理解为什么这段代码有效: String.raw`bla bla` 但是,我似乎无法理解为什么同一个带括号的方法调用会抛出错误: String.raw(`bla bla`) 抛出:uncaughttypeerror:无法将未定义或null转换为对象 我的问题是: 为什么第一个代码片段可以工作
const f = x => "hello ," + x;
f`world` // returns 'hello, world'
所以我可以理解为什么这段代码有效:
String.raw`bla bla`
但是,我似乎无法理解为什么同一个带括号的方法调用会抛出错误:
String.raw(`bla bla`)
抛出:uncaughttypeerror:无法将未定义或null转换为对象
我的问题是:
- 为什么第一个代码片段可以工作?为什么我可以在方法调用中用模板文本替换括号
- 为什么
仅在以这种方式调用时才起作用String.raw
raw
传入模板
但这是:
String.raw(`bla blah`)
…处理模板,创建字符串,然后使用该字符串调用raw
。就像你写的那样:
const str = `bla blah`;
String.raw(str);
…但没有常数
这根本不是一回事
为什么第一个代码片段可以工作
因为标记的模板文字就是这样工作的。他们是他们自己的事
为什么String.raw
仅在以这种方式调用时才起作用
因为它被设计为作为标记函数运行,但是您像调用非标记函数一样调用它,并且没有将标记函数作为标记函数调用时接收到的信息传递给它
如果您看到标记函数接收的内容,可能会有所帮助:
函数foo(字符串,…标记值){
log(“strings:,JSON.stringify(strings));
log(“strings.raw:”,JSON.stringify(strings.raw));
log(“令牌值(“+tokenValues.length+”)”);
tokenValues.forEach((val,index)=>{
log(`${index}:${typeof val}:${JSON.stringify(val)}`);
});
}
const token=“tokenValue”;
常量对象={
福:“酒吧”,
num:Math.random()
};
foo`bla\nbla${token}bla${obj}done`代码>或者,如果要将String.raw作为函数调用,则需要像这样调用它
String.raw({raw: `xyx`})
如文件中所述
调用String.raw的两种方法
String.raw(callSite, ...substitutions)
String.raw`templateString`
另外,这里有一篇很好的文章帮助我理解:我是否可以建议在示例中的标记函数中添加第一个参数的“隐形”raw
属性,它实际上是String.raw
用来实现其神奇功能的?@Nickolay:这一点很好。完成!我加入了一个转义序列,这样人们就可以看到字符串的不同之处了。下面是一些标签函数的常见用例(对于将来阅读此问题的人):相同:)这是一个非常有用的快速答案@T.J.Crowder,谢谢:)
String.raw(callSite, ...substitutions)
String.raw`templateString`