首页 > for 循环的 闭包问题

for 循环的 闭包问题

$scope.addCodeRecord = function () {
            var length = $scope.createCodeData.endSerialNo - $scope.createCodeData.startSerialNo;
              $scope.listArr = [];
              for(var i =0;i<length;i++){
                  $scope.createCodeData.startSerialNo++;
                  $scope.listArr[i] = (function(num){                  
                     $scope.createCodeData.SerialNo = num;
                      // console.log($scope.createCodeData)
                      return $scope.createCodeData;   // 为什么$scope.listArr数组里所有的的SerialNo还是最后的值                
                  })($scope.createCodeData.startSerialNo);
              }

这段代码是为了给一个对象增加第一个递增的属性,我使用了闭包,但是for循环之后还只能拿到最后的值?为何


这里你是把逻辑搞错了。

(function(num) {
                $scope.createCodeData.SerialNo = num;
                // console.log($scope.createCodeData)
                return $scope.createCodeData; // 为什么$scope.listArr数组里所有的的SerialNo还是最后的值                
            })($scope.createCodeData.startSerialNo);

在这个立即调用的函数返回的始终是$scope.createCodeData的引用,所以listArr里的任意一项存储的都是$scope.createCodeData的引用。
你可以定义一个深拷贝函数extend

function is(obj, type) {
    var toString = Object.prototype.toString,
        undefined;
    return (type === 'Null' && obj === null) ||
        (type === "Undefined" && obj === undefined) ||
        toString.call(obj).slice(8, -1) === type;
}
/*
 * 深拷贝函数
 * @param {Object} oldObj: 被拷贝的对象
 * @param {Object} newObj: 需要拷贝的对象
 * @ return {Object} newObj: 拷贝之后的对象
 */
function extend(oldObj, newObj) {
    for (var key in oldObj) {
        var copy = oldObj[key];
        if (oldObj === copy || key in newObj) continue; //如window.window === window,会陷入死循环,需要处理一下
        if (is(copy, "Object")) {
            newObj[key] = extend(copy, newObj[key] || {});
        } else if (is(copy, "Array")) {
            newObj[key] = [];
            newObj[key] = extend(copy, newObj[key] || []);
        } else {
            newObj[key] = copy;
        }
    }
    return newObj;
}

return的那行代码改为下面的代码即可。

return extend($scope.createCodeData, {});

应该是因为$scope.createCodeData是引用吧。


$scope.createCodeData.SerialNo = num;每次循环都赋值,最后就应该是最后的值啊。。。。

【热门文章】
【热门文章】