具有闭包函数作用域的意外行为
Unexpected behaviors with closure function scope
我很确定这是一个十便士的闭包问题。但在阅读了几篇关于闭包的文章后,我仍然无法让它发挥作用。
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);
}
}
我想这正是你需要的。添加高亮显示的线条。欢呼
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问多个指令的隔离作用域
- Javascript作用域和Ajax调用;工作不正常
- 向Angular作用域对象添加对象数组——TypeError
- ng重复中的ng模型-初始化唯一作用域属性
- 具有闭包函数作用域的意外行为
- Javascript作用域意外结果
- 角度意外行为.自执行函数调用作用域函数
- 使用Jasmine测试隔离作用域时意外的变量类型