Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带字符串的String.raw仅适用于不带括号的情况_Javascript_Ecmascript 6 - Fatal编程技术网

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`