错误 - 不要在循环中创建函数

时间:2014-02-06 04:53:56

标签: javascript node.js angularjs

我正在尝试替换电子邮件模板中的占位符,以下是我的代码: -

我收到了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;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

来自JSLint Error Explanations

  

这里的基本问题是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;
}