在研究了这个Es6标签模板示例后:
var yo = func`${x} + ${y}\n= ${x + y}`;
one@public-node ~/es6 $ 6to5 tag.js
"use strict";
var _taggedTemplateLiteral = function (strings, raw) {
return Object.freeze(Object.defineProperties(strings, {
raw: {
value: Object.freeze(raw)
}
}));
};
var yo = func(_taggedTemplateLiteral(["", " + ", "\n= ", ""], ["", " + ", "\\n= ", ""]), x, y, x + y);
我看到返回的是var yo = func(strings, raw, x, y, x + y);
我理解有关字符串文字和插入的x
y
值的基础知识。我不明白的是...什么时候使用字符串与什么时候使用原始字符串?由于该函数具有两个数组,并且用户没有控制权来告诉函数何时使用raw以及何时使用cooked(字符串)。
答案 0 :(得分:3)
标记函数func
只传递一个数组。该数组来自_taggedTemplateLiteral
函数,该函数接收传入的"字符串"参数并为其添加一个属性。
函数func
将被声明为这样(ES5样式):
function func(strings) {
var params = [].slice.call(arguments, 1);
// do stuff
}
如果在func
内,需要使用" raw"字符串,它只会访问"字符串"的.raw
属性。变量:
function func(strings) {
var params = [].slice.call(arguments, 1);
var raw2 = strings.raw[2];
// do stuff
}
所以"用户" - 标签功能的作者 - 确实具有控制权。标签功能中的代码可以随时检查模板部件的原始内容。可能的情况是,基本上实现DSL的标记函数可能只想 使用原始字符串,而更简单的模板机制不会关心,并乐于使用& #34;解析"字符串。