Не уверены, правильно ли я сформулировал это, но как мне указать в обратном вызове ссылку на свойство control базового класса?
Это беспокоит меня в течение некоторого времени, и я обычно работаю над этим, но я был бы благодарен, если бы кто-нибудь мог просветить меня о том, как я должен это делать правильно.
var base = function() {
var controls = {};
return {
init: function(c) {
this.controls = c
},
foo: function(args) {
this.init(args.controls);
$(this.controls.DropDown).change(function() {
$(this.controls.PlaceHolder).toggle();
});
}
}
};
Весьма признателен,
Павел



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Здесь вам нужно использовать закрытие.
var base = function() {
var controls = {};
return {
init: function(c) {
this.controls = c
},
foo: function(args) {
this.init(args.controls);
$(this.controls.DropDown).change(function(controls) {
return function(){
$(controls.PlaceHolder).toggle();
}
}(this.controls));
}
}
};
Когда я использую этот подход, кажется, происходит что-то странное. Событие щелчка запускается при загрузке страницы. Я думаю, что это связано с параметром управления в функции обратного вызова, потому что, когда я удаляю это событие, событие щелчка не запускается автоматически.
Используйте силу закрытия:
var base = function() {
var controls = {};
return {
init: function(c) {
this.controls = c
},
foo: function(args) {
var self = this;
this.init(args.controls);
$(this.controls.DropDown).change(function() {
$(self.controls.PlaceHolder).toggle();
});
}
}
};
Хотя закрытие - это предпочтительный, вы также можете использовать jquery bind для передачи объекта:
var base = function() {
var controls = {};
return {
init: function(c) {
this.controls = c
},
foo: function(args) {
this.init(args.controls);
$(this.controls.DropDown).bind('change', {controls: this.controls}, function(event) {
$(event.data.controls.PlaceHolder).toggle();
});
}
}
};
Мне нравится этот подход, и я думаю, если я широко использую jQuery в своем коде, мне следует использовать метод привязки. Я могу какое-то время просто использовать замыкания, чтобы привыкнуть к их использованию, а затем, когда они освоятся, я смогу использовать и то, и другое. Спасибо.
Побей меня на мгновение более элегантным решением: D