我正在尝试替换电子邮件模板中的占位符,以下是我的代码: -
我收到了error : Don't make functions within a loop
var dataPlaceholders = [{
"username":"John Johny",
"website":"w3schools . com"
}];
template_html = "<b>Hello <%= username %>,</b><br/><br/> You are successfuly Registered on xyz.<br/><br/>Thank you <%= website %>";
函数调用: -
function ReplacePlaceholders(dataPlaceholders, template_html){
for (var i = 0; i < dataPlaceholders.length; i++) {
var obj = dataPlaceholders[i];
template_html += "" + template_html.replace("/<%=%>/g", function (match, property) {
return obj[property];
}) + "";
}
return template_html;
}
感谢您的帮助。
答案 0 :(得分:3)
这里的基本问题是JavaScript解释器将为每个循环迭代创建一个函数实例。它必须这样做,因为它不知道函数对象是否会在别处修改。由于函数是标准JavaScript对象,因此它们可以具有与任何其他对象相同的属性,这些属性可以在循环中更改。因此,通过在循环上下文中创建函数,可以使解释器创建多个函数实例,这可能会导致意外行为和性能问题。
答案 1 :(得分:1)
此错误是因为您在循环内创建了一个函数变量:function (match, property)
这意味着如果循环中有100个元素,它将创建100个匿名函数,这对性能不利。
要解决此问题,请在for循环外部移动函数声明。所以你的代码就像这样
function ReplacePlaceholders(dataPlaceholders, template_html){
// here we create a single instance of your match function
var match = function (match, property) {
return obj[property];
}
for (var i = 0; i < dataPlaceholders.length; i++) {
var obj = dataPlaceholders[i];
// now we use our single declared instance inside the for loop
template_html += "" + template_html.replace("/<%=%>/g", match) + "";
}
return template_html;
}