Функция инициализации и объект в Javascript - PullRequest
0 голосов
/ 26 января 2012

У меня есть следующий (упрощенный) код:

var Foo = (function () {
    var data = {},
        settings = {
            // default settings here
        };

    function bar(callback) { // bar is an asynchronous function
        var result = null;
        // fiddle around until you get a result
        if (callback) {
            callback(result);
        }
    }

    return {
        init: function (options, callback) {
            var kallback = callback;
            $.extend(settings, options);
            bar(function () {
                if (kallback) {
                    kallback(WHAT_GOES_HERE);
                }
            });
        },
        debug: function () {
            return {
                settings: settings,
                data: data
            };
        },
        set: function (k, v) {
            settings[k] = v;
        },
        get: function (k) {
            return settings[k];
        }
    };
}());

Код выше находится в файле js, затем в нижнем колонтитуле рассматриваемой страницы:

<script type="text/javascript">
    Foo.init({ option1: "value", option2: "value" }, function (obj) {
        console.log("The object was ", obj);
    });
</script>

В основномвот что я хочу сделать:

  1. Создать объект (с набором необязательных параметров, но не важно для этого вопроса)
  2. На этапе созданияобъект, пусть он вызывает асинхронную функцию
  3. Когда асинхронная функция выполнена, я должен иметь возможность вызвать обратный вызов, а аргументом для обратного вызова должен быть инициализированный объект

Я думал, что this будет работать для WHAT_GOES_HERE и выше, но, по крайней мере, когда я его протестировал, выясняется, что this - это объект DOM Window.

Прежде всего, яправильно построить этот объект?Или есть лучший способ создать его?

Во-вторых, если я все делаю правильно, что должно идти в WHAT_GOES_HERE, чтобы при запуске console.log("The object was ", foo); значение для obj было созданоFoo объект?

1 Ответ

2 голосов
/ 26 января 2012

Да, в анонимной функции, называемой таким образом, this будет ссылаться на объект окна. Чтобы обратиться к этой ссылке из метода init, вы должны сохранить ссылку в другой переменной:

var kallback = callback, self = this;
$.extend(settings, options);
bar(function () {
    if (kallback) {
        kallback(self);
    }
});

Ваш способ создания объекта работает, если вы хотите иметь только один единственный объект foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...