$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;每次循环都赋值,最后就应该是最后的值啊。。。。