2012-03-30 10 views
0

これは10ペニーの閉鎖の質問です。しかし、閉鎖についてのいくつかの記事を読んで、私はまだこれを動作させることはできません。閉鎖機能のスコープでの予期しない動作

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

これはどうして問題ですか? –

+9

バット - JavaScriptのraw SQL文字列が問題のためにBEGGINGされています。 – asawyer

+1

と 'character'は正確にどこに定義されていますか?問題になる可能性のあるグローバル変数のように見えます。 –

答えて

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)); 

編集: 012私は、 "レンダリング" ループで文字を覚えておく必要が

はまた、asawyerは、上記の彼のコメントで正しいです - あなたはnode-mysqlを使用していると仮定すると、それはパラメータ化クエリをサポートしています:

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

それを使用し、自分自身にいくつかの問題を救います!その後、あまりにも、renderに適切なnextCharパラメータを追加

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

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を呼び出す関数を返しますすぐに実行する機能を使用してください。

0

これはあなたが必要とするものだと思います。強調表示された行を追加します。歓声