回调函数访问闭包变量
callback function access to closure variables?
下面这段代码有一个bug,但是它引发了一个有趣的问题。它使用的是angular的$http服务,它会返回一个promise。解析后,回调函数不能访问s1变量。
var ids = [];
ids = ['81074'];
// show what's in
for (var s=0;s<ids.length;s++) {
var s1 = s;
$http.get('http://mydomain.com/api/catalog/product/' + ids[s]).
success(function(data) {
// console.log(s1); <--- reference error
$scope.products[s].setProductData(data);
}).error(function(err){
console.log('--------- error',err);
});
};
s1给出了ReferenceError: s1在调试器中没有定义
有趣的是,它确实可以访问for循环变量s,它总是为1 -正如预期的那样,因为承诺在其递增后得到解决(因此bug BTW)
有人能解释一下为什么吗?
感谢Lior这是for
循环中异步回调的典型问题。s
和s1
只声明一次。即使你在循环中声明了var s1;
, JavaScript也没有块作用域,所以它是不相关的。
这意味着所有迭代都共享相同的变量s
和s1
,因此当回调完成时,$scope.products[s]
正在查找ids.length + 1
的产品。
相反,做的事:
var ids = [];
ids = ['81074'];
function launchRequest(s) {
$http.get('http://example.com/api/catalog/product/' + ids[s]).success(function (data) {
$scope.products[s].setProductData(data);
}).error(function (err) {
console.log('--------- error', err);
});
}
// show what's in
for (var s = 0; s < ids.length; s++) {
launchRequest(s);
}
…它在launchRequest
中引入了一个新的函数级作用域,这意味着当回调解析时,s
仍然是函数中的s
。
相关文章:
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- 如果全局上下文中的变量是属性,那么为了闭包的目的,如何区分它们
- 如何访问闭包中的变量
- 闭包中的本地变量从外部更改.这是一个javascript错误,或者我做错了什么
- 使用JavaScript回调函数了解变量作用域和闭包
- 递增并存储一个“;私人的“;使用闭包的变量
- 循环和局部变量内部的闭包
- 未使用JS闭包将变量传递给onClick函数
- 函数变量闭包
- 陷入javascript变量闭包
- 用具体的例子理解Javascript中的私有变量(闭包?)