JavaScript Object literal方法:递归调用

use*_*959 8 javascript recursion function-literal object-literal

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

例如:

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

    obj.f();
}());
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

use*_*621 15

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

        f: function myself() {
            if (abc.length) {
                abc.shift();
                myself(); // Recursive call
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是选择的答案.谢谢你的链接. (2认同)

Ada*_*kis 5

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

f: function () {
    if (abc.length) {
        abc.shift();
        this.f(); // Recursive call
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

var func = obj.f;
func();
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*nen 1

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