8

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

例如:

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

    obj.f();
}());

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

谢谢。

4

3 回答 3

17

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

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

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

于 2012-01-25T17:42:39.803 回答
5

f是你的对象的方法。结果,当您在 中时fthisf是附加到的对象。所以要递归调用f,使用this.f()

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

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

如果您执行以下操作: obj.f.call(lala);,那么this现在将是lala。如果您执行以下操作:

var func = obj.f;
func();

现在this是内部的全局对象f(或在严格模式下未定义)

于 2012-01-25T17:01:18.987 回答
1

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

于 2012-01-25T16:54:03.867 回答