具有闭包功能范围的意外行为

时间:2012-03-30 14:34:27

标签: javascript for-loop closures

我相当确定这是一个十便士关闭问题。但是,阅读了一些关于闭包的文章,我仍然无法让它工作。

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

4 个答案:

答案 0 :(得分: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 ]);

使用它并省去一些麻烦!

答案 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));
    }
}

答案 2 :(得分:0)

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

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

然后将相应的nextChar参数添加到render

答案 3 :(得分: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);
    }
}

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