Javascript 在循环内使用回调进行闭包访问

Javascript closure access with callbacks inside loop

我应该怎么做才能使最后一行代码 return 成为一个值?

$scope.runActionwithObjects = function() {

            for (var i = 0; i < $scope.Objects.length; i++) {
                console.log($scope.Objects[i]); //$scope is accessible
                $http.get($scope.Objects[i]["Commit"]).success(function (data) {
                    console.log($scope.Objects[i]);//return undefined

你的 $scope.Objects[i] 未定义的原因是因为变量 i 总是 = $scope.Objects.lenth + 1,例如你有 5 个元素,i 将是 6,因为当时的回调,它已经得到了最后一个值。

一个解决方案是将需要的对象绑定到该方法,因此我们可以通过 this 访问它(我们不能通过闭包直接引用 ref 变量,因为它仍然存储最后一项), 例如:

           for (var i = 0; i < $scope.Objects.length; i++) {
               var ref = $scope.Objects[i];
               // console.log($scope.Objects[i]); //$scope is accessible
               var successCallback = (function (data) {
                   console.log(this);//return the ref

               }).bind(ref);
               $http.get('').success(successCallback);
           }
       }

问题是由于 异步 的 ajax 个请求。

当执行 success 回调时,您的循环 已经完成 并且 i 变量已经等于 $scope.Objects.length

尝试forEach。此函数将为数组中的项目创建不同的闭包。

$scope.Objects.forEach(function(currentObject){
    console.log(currentObject); //$scope is accessible
    $http.get(currentObject["Commit"]).success(function (data) {
        console.log(currentObject);
    });
});