如何递归调用函数

时间:2014-11-04 19:14:29

标签: angularjs recursion

我试图以递归方式调用我的mapper函数但是没有定义错误:'ReferenceError:mapper未定义在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);

1 个答案:

答案 0 :(得分:1)

如果你为匿名函数添加一个名字,你可以像这样在内部调用它:

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;
});