如何调用的函数递归
问题描述:
我试图递归调用我的映射功能,但越来越不定义的错误:“的ReferenceError:映射器没有在规定的Object.mapper”如何调用的函数递归
能使用上如何调用一些指导函数递归地在这个特定的情况下。
angular.module('dvb.transferObjects').value('MappedTransferObject', function(obj1) {
'use strict';
return {
mapper: function(obj2) {
for (var p in obj1) {
if (typeof obj1[p] === 'object') {
mapper(obj1[p], obj2[p]);
} else {
if(obj2.hasOwnProperty(p)) {
obj1[p] = obj2[p];
}
}
}
return obj1;
}
};
});
我注入我的控制器MTO此值,并如下使用它:
var mto = new MTO(appState.getTemplateObject());
var mappedObject = mto.mapper($scope.dvModel);
答
如果名称添加到您的匿名函数可以调用它本身里面,像这样:
angular.module('dvb.transferObjects').value('MappedTransferObject', function (obj1) {
'use strict';
return {
mapper: function mapper(obj2) {
for (var p in obj1) {
if (typeof obj1[p] === 'object') {
mapper(obj1[p], obj2[p]);
} else {
if (obj2.hasOwnProperty(p)) {
obj1[p] = obj2[p];
}
}
}
return obj1;
}
};
});
在您的示例中不能使用mapper
的原因是由于mapper
被限制在对象本身的范围内。这意味着访问功能将返回之前调用它通过对象,你不能这样做,不保存关闭的对象的引用的唯一途径:
angular.module('dvb.transferObjects').value('MappedTransferObject', function (obj1) {
'use strict';
var mapper = {
mapper: function (obj2) {
for (var p in obj1) {
if (typeof obj1[p] === 'object') {
mapper.mapper(obj1[p], obj2[p]);
} else {
if (obj2.hasOwnProperty(p)) {
obj1[p] = obj2[p];
}
}
}
return obj1;
}
};
return mapper;
});
THX,这个解决它! – 2014-11-04 22:35:01