Javascript 具有闭包函数作用域的意外行为

Javascript 具有闭包函数作用域的意外行为,javascript,for-loop,closures,Javascript,For Loop,Closures,我相当肯定这是一个十分重要的问题。但是读了几篇关于闭包的文章后,我仍然无法实现这一点 字符始终作为“Z”返回字符也是一个全局变量 我需要“渲染”来记住循环中的角色: populateList: function() { var render = function(tx, result) { console.log(character); for (var i = 0; i < result.rows.length

我相当肯定这是一个十分重要的问题。但是读了几篇关于闭包的文章后,我仍然无法实现这一点

字符
始终作为“Z”返回<代码>字符也是一个全局变量

我需要“渲染”来记住循环中的角色:

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);
    }
}
populateList:function()
{           
var render=函数(发送,结果)
{   
console.log(字符);
对于(var i=0;i
未经测试:

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));
    }
}
populateList:function()
{           
var render=函数(字符)
{   
console.log(char);
返回函数(发送、结果){
对于(var i=0;i
编辑:

另外,asawyer在上面的评论是正确的——假设您正在使用,它支持参数化查询:

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

使用它,省去你自己的一些麻烦

使用一个立即执行的函数,该函数返回一个调用
render
的函数,该函数使用以下参数:

database.query(sql, (function(nextChar) {
    return function(tx, result) {
        return render(tx, result, nextChar);
    };
})(nextChar));
然后将适当的
nextChar
参数也添加到
render

var render=function(tx,result)
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);
    }
}
{ console.log(字符); ***var char=字符*** 对于(var i=0;i

我想这就是你需要的。添加高亮显示的行。干杯

那么到底是什么问题呢?javascript中的原始sql字符串马上就在招惹麻烦。而
字符
的定义到底在哪里?看起来像一个全局变量,这可能是问题所在。
database.query(sql, (function(nextChar) {
    return function(tx, result) {
        return render(tx, result, nextChar);
    };
})(nextChar));
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);
    }
}