2012-03-30 34 views
0

我相当肯定这是一个十分钱关闭问题。但在阅读关于封闭的一些文章后,我仍然无法得到这个工作。关闭功能范围的意外行为

character总是作为'Z'返回。 character也是一个全局变量。

我需要 “渲染” 记得在循环中的字符:

populateList: function() 
{   
    var render = function(tx, result) 
    { 
     console.log(character); 

     for (var i = 0; i < result.rows.length; i++) 
     { 
      var contact = result.rows.item(i); 
      console.log(contact.Name); 
     } 
    } 

    var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    for(var i = 0; i < str.length; i++) 
    { 
     var nextChar = str.charAt(i); 
     database.open(); 
     var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name"; 
     database.query(sql, render); 
    } 
} 
+1

究竟是什么问题? – 2012-03-30 14:37:08

+9

马上关闭蝙蝠 - 在JavaScript中的原始sql字符串是为了减少麻烦。 – asawyer 2012-03-30 14:37:12

+1

和'character'被定义在哪里?看起来像一个全局变量,这可能是问题所在。 – 2012-03-30 14:39:39

回答

1
var render = function(character) 
{ 
    return function(tx, result) 
    { 
     console.log(character); 

     for (var i = 0; i < result.rows.length; i++) 
     { 
      var contact = result.rows.item(i); 
      console.log(contact.Name); 
     } 
    } 
} 

用法:

database.query(sql, render(nextChar)); 

编辑:

此外,asawyer在上面他的评论正确的 - 假设你使用node-mysql,它具有参数化查询的支持:

database.query("SELECT * FROM foo WHERE bar = ?", [ 1 ]); 

请使用和保存自己的一些麻烦!

0

未经测试:

populateList: function() 
{   
    var render = function(char) 
    { 
     console.log(char); 
     return function(tx, result) { 

      for (var i = 0; i < result.rows.length; i++) 
      { 
       var contact = result.rows.item(i); 
       console.log(contact.Name); 
      } 
     }; 
    } 

    var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    for(var i = 0; i < str.length; i++) 
    { 
     var nextChar = str.charAt(i); 
     database.open(); 
     var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name"; 
     database.query(sql, render(nextChar)); 
    } 
} 
0

使用的立即执行函数返回调用render与参数的函数:

database.query(sql, (function(nextChar) { 
    return function(tx, result) { 
     return render(tx, result, nextChar); 
    }; 
})(nextChar)); 

然后适当nextChar参数添加到render了。

0
var render = function(tx, result) 
{ 
    console.log(character); 
    ***var char = character;*** 
    for (var i = 0; i < result.rows.length; i++) 
    { 
     var contact = result.rows.item(i); 
     ***console.log(char);*** 
     console.log(contact.Name); 
    } 
} 

我想这是你需要的。添加突出显示的行。欢呼声