我有一个带回调的自动完成功能来返回数据。许多不同的实例都使用此自动完成功能。
$.fn.acItem = function(callback){
var self = this;
$(self).autocomplete({
(...)
select: function(e, ui){
// Eval for calling anonymous function (right?)
window[callback](ui.item);
}
});
};
我也使用名称空间
var Agency = {
init: function() {
var self = this;
self.registerAgency.addItem();
},
registerAgency: {
(...)
addItem: function(item){
if(!item){
(...)
// Initiate autocomplete on input
$('.search-item').acItem('Agency.registerAgency.addItem');
} else {
// Do something with Item
}
}
}
Agency.init();
如果我没有使用命名空间,则使用window[callback](ui.item)
可以正常工作。但是对于命名空间,它会变得更加复杂,如described by Jason Bunting。
由于不同的名称空间使用acItem()
,因此需要知道在回调中调用哪个函数。但是很多人强烈建议不要使用Eval来调用匿名函数。
那么在匿名函数上进行回调的好方法是什么?
答案 0 :(得分:6)
window['foo']()
不“eval”。它与使用不同语法的window.foo()
相同,您可能也不会将其称为“eval”。这个问题是你希望你的回调函数是一个特别命名的全局函数。但您不必按名称传递函数;函数是Javascript中的第一类对象,可以直接传递给作为值。实际上你应该简单地接受一个函数作为回调:
$.fn.acItem = function(callback) {
callback();
};
此函数接受回调函数并调用它。很直接。你会像这样传递回调:
$('.search-item').acItem(function () { .. });
// or:
$('.search-item').acItem(this.registerAgency.addItem);
// or, to preserve the `this` context inside the callback:
$('.search-item').acItem(this.registerAgency.addItem.bind(this.registerAgency));
答案 1 :(得分:0)
如果acItem
可以将函数作为参数,您只需要像这样:
$('.search-item').acItem(Agency.registerAgency.addItem);
当你这样给它时,不会执行该功能。你只需要给出这个功能,你就不会执行它。