callback 函数的 scope 变数范围问题
发布于 11 年前 作者 grass0916 5397 次预览 最后一次回复是 11 年前 来自
在 User_UidSearch 函式当中我想要取用上一层 for 回圈的i ,但没有办法,这个 i 的scope 让我有点疑惑,不晓得各位前辈有没有不使用全域变数的解决办法呢?
Task_TidSearchExecution = function(tid, callback) {
var sql = "SELECT * FROM execution WHERE task = '" + tid + "'";
dbclient.query(sql, function (err, results) {
if (err || results.length <= 0)
callback(false);
else {
console.log(results.length);
for (var i = 0 ; i < results.length ; i++) {
User_UidSearch(results[i].employee, function (user) {
console.log(i);
// results[i]['email'] = user.email;
});
}
callback(results);
}
});
}
console.log(result[i]); 输出都是 undefined。 如果我的 results.length 为 2,console.log(i); 都是 2
17 回复
经典问题。
主要思路就是,把 i 变成局部变量,而不是引用,就好了。
@alsotang 感谢大侠帮助,成功的让 i 进去该 callback 中。 我想应该是我javascript 学艺不精,请问这个方法有什么名称吗?
@grass0916 闭包
@chloe 谢谢前辈。 现在衍生了其他后续问题,待我修正后再一次把问题的解法程式码更新到文章中。
经过前辈们指教,解决的上述的问题,以及衍生出来的问题。
程式码如下,不过觉得可读性有点低,想请教有没有更精炼的优化方式。
@chloe @alsotang 下面回覆附上了成功运行的程式码,想问问有没有其他精炼的写法。
看这术语用的你是台湾人吗?
@ravenwang 是的
@grass0916
我有几个建议。
对于
Task_TidSearchExecution = function(tid, callback):var Task_TidSearchExecution = function(tid, callback);AddEmployeesInfo,把Task_TidSearchExecution改为findExecutionTaskById更自然点;callback没有遵循Node.js的例行写法。一般来说,callback函数都被定义成callback(err, arg1, arg2, ...)的形式。因此,建议把callback的函数原型修改为callback(err, results);if (err || results.length<=0)中没必要添加results.length<=0的判断;else部分,AddEmployeesInfo函数的定义似乎是多此一举,直接在else下面写for循环的语句就可以了;User_UidSearch函数的定义,更多优化无从下手。感觉有进一步优化的空间。@ravenwang 我都没发现这点,经你一提醒,看了看还真是台湾术语
@alsotang 大家不会排斥我吧 … ? Q_Q
@bnuhero 前辈早安,根据你宝贵的建议我尝试做了一些更动,还请你审视一番。
@grass0916 那倒不会…只是我平时很少见到那些翻译
@grass0916 欢迎台湾同胞:)
@ravenwang @alsotang 谢谢大家不嫌弃 <(_ _ *)>
@grass0916
关于回调函数的惯常写法,举个例子。
像你的代码中的
callback,把代表出错信息的对象和正常结果的对象用同一个参数表示,不符合如上所述的惯常用法。