考虑以下代码片段:
for(var i = 0; i < arr.length; ++i) {
var newObject = new someFunction(arr[i]);
//async callback function
$http.get('someurl').then(
function(data) {
newObject.data = data;
}
);
}
对比
function registerCallbacks(o) {
$http.get('someurl').then(
function(data) {
o.data = data;
}
);
}
for(var i = 0; i < arr.length; ++i) {
var newObject = new someFunction(arr[i]);
registerCallbacks(newObject);
}
第一个示例将仅对数组中的最后一个对象执行异步操作,而第二个示例将按预期工作。 我知道在第一个示例中,回调都引用同一个变量“newObject”,因此只对一个对象起作用。 但是为什么在第二个例子中不是这样呢? ‘o’ 不会指向最后一个函数调用的参数吗?
恐怕我错过了一些关于如何在 javascript 中传递值的基本知识,如果有人能向我解释它是如何工作的,我将不胜感激。
干杯!
最佳答案
在第一个示例中,newObject
对象在调用异步回调时可能没有相同的值,因为它的作用域仍在其父方法中,并且 newObject 的主要值
将被内部 block 使用。
然而,在第二个中 newObject
被传递给另一个方法作为 o
(一个新的引用),它在范围内没有相同的变量,因为它在外部那个 for 循环 block 。
关于javascript - 为什么将异步回调移出循环会改变结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284881/