我发现了由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:如果出现意外令牌”

谁能帮助我将此代码转换为条件语句,甚至可以给我解释代码的作用吗?

另外出于好奇,有人可以告诉我IE8是否支持此代码?
注意:我不介意IE8支持,我只想知道此模板引擎是否支持IE8。

您可以在Krasimir的Website或Krasimir的Github上找到模板引擎

最佳答案

您不应该将代码追加到行中,而必须追加到代码中,请尝试以下操作:

if (js && type(js) !== "undefined") {
  if (line.match(reExp)) {
    code += line;
  } else {
    code += "r.push(" + line + ");";
  }
} else if (line !== "") {
  code = code + "r.push(\"" + line.replace(/"/g, '\\"') + "\");";
}

08-04 16:42