Установить переменную и перейти к функции или переустановить переменную?

Какой лучше? Установите переменную и передайте ее в вызов, или каждый раз устанавливайте переменную снова. я хочу self = this (т.е. слайдер объект) для согласованности.

РЕДАКТИРОВАТЬ для ответов: я знаю, что я могу использовать this но я работаю с другими членами команды и согласился на последовательность использования self при ссылке на объект в любое время.

Так это лучше:

Slider = {
    init: function() {
        var self = this,
        foo = $('.someElement');

        self.bindEvent(self);
    },

    bindEvent: function(self) {
        self.foo.on('click', self.wasClicked(self));
    },

    wasClicked: function(e, self) {
        e.doSomething();
        self.done();
    }
};

Или это:

Slider = {
    init: function() {
        var self = this,
        foo = $('.someElement');

        self.bindEvent();
    },

    bindEvent: function() {
        var self = this;
        self.foo.on('click', self.wasClicked);
    },

    wasClicked: function(e) {
        var self = Slider;
        e.doSomething();
        self.done();
    }
};

2 ответа

Решение

Ваш код более пригоден для повторного использования, если вы используете аргумент для своей цели привязки, как в первом примере. Например:

bindEvent: function(target) {
    target.onclick = function() { alert(target + " was clicked"); };
}

bindEvent() теперь может вызываться другими функциями и предназначаться для чего-то другого, кроме self, В то время как в вашем текущем объекте Slider его нужно вызывать только init()в будущем вы можете в конечном итоге добавить в Slider функциональность, которая выиграет от повторного использования этой функции. В этот момент вы можете избежать переписывания функции или, что еще хуже, создать дублирующую функцию для нового варианта использования.

В ситуациях, когда self это не цель, просто ссылка на родителя, любой пример подойдет. Если ваша функция уже имеет длинный список аргументов, которые она принимает, self внутри функции вместо передачи ее в качестве аргумента часто хорошая идея. Множество аргументов усложняют понимание, рефакторинг и тестирование кода.

Вам нужно только self в wasClickedв других случаях использования this:

Slider = {

    init: function() {
        foo = $('.someElement');
        this.bindEvent();
    },

    bindEvent: function() {
        this.foo.on('click', this.wasClicked);
    },

    wasClicked: function(e) {
        var self = Slider;
        e.doSomething;
        self.done();
    }

}

Slider.init();

Что касается вашего редактирования: в первом варианте обработчик событий не будет работать, потому что вы вызываете его сразу, а не передаете ссылку. Вы должны изменить метод, чтобы вернуть функцию.

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