Использование свойства экземпляра в IIFE

Как использовать переменную экземпляра в IIFE в методе?

Я получаю сообщение об ошибке от моего метода запуска:

Uncaught TypeError: undefined не является функцией

Я зарегистрировал this.element в консоли, и он отображается как undefined, но вне IIFE он работает нормально.

Как я могу заставить его работать внутри IIFE? Я пытался передать его в IIFE в качестве аргумента, но это тоже не сработало.

function LiveDateTime(element) {
    'use strict';

    this.element = element;
}

LiveDateTime.prototype = {
    setLocale: function (locale) {
        this.locale = locale;
    },

    setOffsetSeconds: function (seconds) {
        this.offsetSeconds = seconds;
    },

    setDaylightSavingTimeSeconds: function (seconds) {
        this.daylightSavingTimeSeconds = seconds;
    },

    start: function () {
        (function update() {
            var now = new Date();
            var now = new Date(
                now.getUTCFullYear(),
                now.getUTCMonth(),
                now.getUTCDate(),
                now.getUTCHours(),
                now.getUTCMinutes(),
                now.getUTCSeconds(),
                now.getUTCMilliseconds()
            );

            this.element.innerHTML = now.toLocalString('fr-FR'); // <--
            this.timeoutId = setTimeout(update, 50); // <--
        })();
    },

    stop: function () {
        clearTimeout(this.timeoutId);

        this.timeoutId = 0;
    }
};

person Kid Diamond    schedule 01.01.2015    source источник


Ответы (1)


Сохраните ссылку на this в переменной, например так

start: function() {
    var self = this;

    (function update() {
        var now = new Date();
        var now = new Date(
            now.getUTCFullYear(),
            now.getUTCMonth(),
            now.getUTCDate(),
            now.getUTCHours(),
            now.getUTCMinutes(),
            now.getUTCSeconds(),
            now.getUTCMilliseconds()
        );

        self.element.innerHTML = now.toLocalString('fr-FR'); // <--
        self.timeoutId = setTimeout(update, 50); // <--
    })();
},
person Oleksandr T.    schedule 01.01.2015
comment
FWIW, я предпочитаю этот метод .bind - это идеальное использование способности JS закрывать внешние переменные, которые используются внутри .bind, но без накладных расходов на создание нового функционального объекта. Я рекомендую .bind только в том случае, если у вас нет контроля над лексической областью действия функции, которую вы вызываете. - person Alnitak; 02.01.2015