Установить переменную и перейти к функции или переустановить переменную?
Какой лучше? Установите переменную и передайте ее в вызов, или каждый раз устанавливайте переменную снова. я хочу 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();
Что касается вашего редактирования: в первом варианте обработчик событий не будет работать, потому что вы вызываете его сразу, а не передаете ссылку. Вы должны изменить метод, чтобы вернуть функцию.