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オブジェクトのメソッドです。その結果、 の場合、fがアタッチthisされるオブジェクトになります。fしたがって、再帰的に呼び出す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コードのどこにもdefinedと呼ばれる変数はありません。使用しますobj.f()(または、必要な場所を指していることthis.fがわかっている場合)。this

于 2012-01-25T16:54:03.867 に答える