javascript - for 循环的 闭包问题
巴扎黑
巴扎黑 2017-04-11 11:50:02
[JavaScript讨论组]
$scope.addCodeRecord = function () {
            var length = $scope.createCodeData.endSerialNo - $scope.createCodeData.startSerialNo;
              $scope.listArr = [];
              for(var i =0;i

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

巴扎黑
巴扎黑

全部回复(3)
高洛峰

这里你是把逻辑搞错了。

(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, {});
ringa_lee

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

PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号