2014-02-06 37 views
-4

我想在一个电子邮件模板来替换占位符,继内作出功能是我的代码: -错误 - 不要循环

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

感谢您的帮助。

+3

为了帮助你*什么*?错误消息明确指出错误 – zerkms

+0

@Zerkms我得到了1个新错误:在创建一个新函数后....错误:在调用构造函数时缺少新的前缀 – Anup

+2

你知道什么http://google.com是什么? – zerkms

回答

3

JSLint Error Explanations

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

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; 
} 
+0

是的,我做到了这一点......但占位符不会在我的邮件中被替换...... wt可能是问题所在? – Anup

+0

@Anup无法帮助对不起。有太多我们不知道的事情。发布另一个问题,提供有关'dataPlaceholders'和'template_html'中的内容的信息 – jasonscript