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

Unexpected behaviors with closure function scope

本文关键字:意外 作用域 闭包 函数      更新时间:2023-09-26

我很确定这是一个十便士的闭包问题。但在阅读了几篇关于闭包的文章后,我仍然无法让它发挥作用。

character始终返回为"Z"。CCD_ 2也是一个全局变量。

我需要"渲染"来记住循环中的字符:

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);
    }
}
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在上面的评论中是正确的——假设您使用的是nodemysql,它支持参数化查询:

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

使用它,为自己省去一些麻烦!

未测试:

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

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

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

然后也将适当的nextChar参数添加到render中。

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

我想这正是你需要的。添加高亮显示的线条。欢呼