2012-03-30 67 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); 
    } 
} 

我想這是你需要的。添加突出顯示的行。歡呼聲