Объектный метод JavaScript Object: рекурсивный вызов - PullRequest
8 голосов
/ 25 января 2012

Можно ли рекурсивно вызвать метод из литерала объекта?

Например:

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

    obj.f();
}());

Ошибка: «f» использовалось до того, как было определено.

Спасибо.

Ответы [ 3 ]

15 голосов
/ 25 января 2012

Вы можете, используя именованное выражение функции :

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

Обязательно читать: http://kangax.github.com/nfe/

4 голосов
/ 25 января 2012

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();

Теперь this - это глобальный объект внутри f (или неопределенный в строгом режиме)

1 голос
/ 25 января 2012

В вашем коде нет ни одной переменной с именем f.Используйте obj.f() (или this.f, если вы знаете, this указывает на то, где он должен).

...