当我浏览JavaScript 微模板源代码时,我对 2 个问题感到困惑:
- 为什么要使用new Function而不是定义一个通用函数?
- 为什么在new Function中没有直接引用data参数,而是可以替换为正确的值。我希望使用data[$1]从数据中获取正确的值。
编码:
(function(){
var cache = {};
this.tmpl = function tmpl(str, data){
// Figure out if we're getting a template, or if we need to
// load the template - and be sure to cache the result.
var fn = !/\W/.test(str) ?
cache[str] = cache[str] ||
tmpl(document.getElementById(str).innerHTML) :
// Generate a reusable function that will serve as a template
// generator (and which will be cached).
new Function("obj",
"var p=[],print=function(){p.push.apply(p,arguments);};" +
// Introduce the data as local variables using with(){}
"with(obj){p.push('" +
// Convert the template into pure JavaScript
str
.replace(/[\r\t\n]/g, " ")
.split("<%").join("\t")
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%>/g, "',$1,'")
.split("\t").join("');")
.split("%>").join("p.push('")
.split("\r").join("\\'")
+ "');}return p.join('');");
// Provide some basic currying to the user
return data ? fn( data ) : fn;
};
})();
- 期望得到这样的语句,
"<div>",name,"</div>"
然后我们可以使用 with 语句。但是 String.replace() 总是返回字符串。我们期望一个符号而不是一个字符串。所以在这种情况下,级别类型是最好的选择。这就是我得到的。请纠正我,如果我错了。 - 第二个问题的关键:
- 柯里化函数
- 与声明
例子:
function wrapperFn(data) {
var fn = function anonymous(obj) {
var p=[],
print=function(){p.push.apply(p,arguments);};
with(obj) {
p.push(' <p>',name,'</p> ');
}
console.log("p.join(''):", p.join(''));
return p.join('');
}
return fn(data);
}