【问题标题】:Error - Don't make functions within a loop [closed]错误 - 不要在循环中创建函数 [关闭]
【发布时间】:2014-03-02 21:21:37
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

  • 什么方面帮助您?错误消息清楚地说明了问题所在
  • @Zerkms 我得到了 1 个新的 error :创建新函数后....error : missing new prefix when invoking a constructor
  • 你知道google.com是什么吗?
  • @zerkms 我非常着急...如果你不想帮忙...留下问题...我是初学者到node.js
  • 匆忙并不能证明懒惰,对不起。

标签: javascript node.js angularjs


【解决方案1】:

来自JSLint Error Explanations

这里的基本问题是 JavaScript 解释器将在每次循环迭代时创建一个函数实例。它必须这样做,因为它不知道函数对象是否会在其他地方被修改。由于函数是标准的 JavaScript 对象,它们可以像任何其他对象一样具有可以在循环中更改的属性。因此,通过在循环上下文中创建函数,您会导致解释器创建多个函数实例,这可能会导致意外行为和性能问题。

【讨论】:

    【解决方案2】:

    这个错误是因为你在循环中创建了一个函数变量: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;
    }
    

    【讨论】:

    • 是的,我这样做了...但是我的邮件中没有替换占位符...wt 可能是问题所在?
    • @Anup 忍不住抱歉。我们不知道的事情太多了。发布另一个问题,提供有关 dataPlaceholderstemplate_html 中的内容的信息
    猜你喜欢
    • 2011-10-15
    • 2014-08-17
    • 2023-03-30
    • 2011-10-29
    • 1970-01-01
    • 2011-03-03
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多