JavaScript Литеральный метод объекта: рекурсивный вызов

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

Например:

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

    obj.f();
}());

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

Благодарю.

3 ответа

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

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

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

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 (или неопределенный в строгом режиме)

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

Другие вопросы по тегам