JavaScript对象字面量方法:递归调用

8

一个字面量对象是否可以递归地调用一个方法?

例如:

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

    obj.f();
}());

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

谢谢。

3个回答

17

你可以使用一个具名函数表达式来实现:

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

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


2
这应该是被选中的答案。谢谢提供链接。 - kliron
将它变成一个命名函数确切地可以绕过错误,这是因为它会创建自己的闭包吗? - Pasha Skender

5

f是您对象上的一个方法。因此,在f中,this将是附加到f的对象。因此,要递归调用f,请使用this.f()

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

请注意,在f函数内部,只有在以方法形式调用f时,this才会是当前对象:obj.f();

如果你像这样做:obj.f.call(lala);,那么this现在将会是lala。如果你像下面这样做:

var func = obj.f;
func();

现在,在f函数内部,this是全局对象(在严格模式下为undefined)


根据调用 f 的方式,this 可能指向 obj,也可能不指向。最好在出现问题之前澄清这一点。 - Matti Virkkunen
@MattiVirkkunen - 确实如此 - 已编辑。感谢您的提示,祝您获得新徽章 :) - Adam Rackis
Yay! - Matti Virkkunen

1

你的代码中没有定义任何名为f的变量。使用obj.f()(如果你知道this指向正确的位置,也可以使用this.f)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接