如何递归调用函数 [英] How to call function recursively

查看:44
本文介绍了如何递归调用函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图递归调用我的mapper函数,但未定义错误:'ReferenceError:未在Object.mapper上定义mapper'

I'm trying to call my mapper function recursively but getting the error not defined: 'ReferenceError: mapper is not defined at Object.mapper'

在这种特殊情况下,可以使用一些有关如何递归调用该函数的指导.

Could use some guidance on how to call the function recursively in this particular situation.

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注入到控制器中,并按如下方式使用它:

I'm injecting this value in my controller as MTO and using it as follows:

var mto = new MTO(appState.getTemplateObject());
var mappedObject = mto.mapper($scope.dvModel);

推荐答案

如果将名称添加到匿名函数中,则可以像这样在其内部调用它:

If you add a name to your anonymous function you can call it inside itself like so:

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 的作用域仅限于对象本身.这意味着访问该函数的唯一方法是通过该对象调用该函数,而在返回该对象之前,必须先保存对该对象的引用,否则无法执行此操作:

The reason you can not use mapper in your example is due to the mapper being scoped to the object itself. This means the only way to access the function would be to call it through the object, which you can't do without saving off a reference to the object before returning it:

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

这篇关于如何递归调用函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆