JavaScript Object literal方法:递归调用

时间:2012-01-25 16:51:20

标签: javascript recursion object-literal function-literal

是否可以从对象文字中递归调用一个方法?

例如:

(function () {
    'use strict';
    var abc = ['A', 'B', 'C'],
        obj = {
            f: function () {
                if (abc.length) {
                    abc.shift();
                    f(); // Recursive call
                }
            }
        };

    obj.f();
}());

错误:在定义之前使用'f'。

感谢。

3 个答案:

答案 0 :(得分:14)

您可以使用命名函数表达式

        f: function myself() {
            if (abc.length) {
                abc.shift();
                myself(); // Recursive call
            }
        }

必读:http://kangax.github.com/nfe/

答案 1 :(得分:4)

f是您对象上的方法。因此,当您在f时,this将成为f所附加的对象。因此,要递归调用f,请使用this.f()

f: function () {
    if (abc.length) {
        abc.shift();
        this.f(); // Recursive call
    }
}

请注意,在f内部,如果this作为方法调用,f将只是当前对象:obj.f();

如果您执行以下操作:obj.f.call(lala);,则this现在将为lala。如果你做了类似的事情:

var func = obj.f;
func();

现在thisf内的全局对象(或严格模式下未定义)

答案 2 :(得分:1)

在代码中的任何位置都没有定义名为f的变量。使用obj.f()(或this.f,如果您知道this指向它应该的位置。