【发布时间】:2016-03-28 20:27:03
【问题描述】:
我找到了由 Krasimir 构建的 完美 JavaScript 模板引擎,它正是我所需要的。
模板引擎工作得很好,但我自然无法抗拒对它进行修改的冲动,甚至可能添加一些功能。
不幸的是,我无法理解某些代码。
代码如下:
var TemplateEngine = function(html, options) {
var re = /<%([^%>]+)?%>/g,
reExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,
code = 'var r=[];\n',
cursor = 0,
match;
var add = function(line, js) {
/* --begin problem */
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
/* --end problem */
return add;
};
while (match = re.exec(html)) {
add(html.slice(cursor, match.index))(match[1], true);
cursor = match.index + match[0].length;
}
add(html.substr(cursor, html.length - cursor));
code += 'return r.join("");';
return new Function(code.replace(/[\r\t\n]/g, '')).apply(options);
};
这是我不明白的行:
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
我对 JavaScript 并不陌生,但那是一些看起来很奇怪的代码,据我所知,它是一个没有左手赋值的三元运算符(如果我错了,请纠正我)
因此,为了更好地理解作者在做什么,我尝试将三元运算符转换为条件语句。
这是我目前所拥有的:
if(js) {
if(code += line.match(reExp)) {
line += '\n';
} else {
line += 'r.push(' + line + ');\n';
}
} else {
if(code += line !== '') {
line += 'r.push("' + line.replace(/"/g, '\\"') + '");\n';
} else {
line += "";
}
}
这失败并抛出错误“Uncaught SyntaxError: Unexpected token if”
谁能帮我把这段代码转换成条件语句,甚至可以解释一下这段代码的作用?
出于好奇,谁能告诉我 IE8 是否支持此代码?
注意:我不介意 IE8 支持我只想知道这个模板引擎是否支持 IE8。
【问题讨论】:
-
您的备用代码没有语法错误。如果您收到该错误,则它来自其他地方。
-
@Pointy 是的,这就是我的想法,我也 100% 肯定模板代码也没有语法错误,因为我使用了示例中的相同代码,也许我已经声明中有错误?
标签: javascript templates templating client-side-templating templating-engine