如何在不使用 Eval 的情况下调用匿名函数?
How can I call anonymous function without using Eval?
我有一个自动完成功能,可以回调 return 数据。这个自动完成功能被许多不同的实例使用。
$.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 调用匿名函数。
那么对匿名函数进行回调的好方法是什么?
window['foo']()
是 而不是 "eval"。它与使用不同语法的 window.foo()
相同,您可能也不会调用 "eval"。
问题在于您希望回调函数是专门命名的全局函数。但是您不必按名称传递函数;函数是 Javascript 中的第一个 class 个对象,可以直接 作为值 传递。你实际上应该简单地接受一个函数作为回调:
$.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));
如果acItem
可以接受一个函数作为参数,你只需要像这样给它:
$('.search-item').acItem(Agency.registerAgency.addItem);
这样给函数是不会执行的。你只给函数,你不执行。
我有一个自动完成功能,可以回调 return 数据。这个自动完成功能被许多不同的实例使用。
$.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 调用匿名函数。
那么对匿名函数进行回调的好方法是什么?
window['foo']()
是 而不是 "eval"。它与使用不同语法的window.foo()
相同,您可能也不会调用 "eval"。问题在于您希望回调函数是专门命名的全局函数。但是您不必按名称传递函数;函数是 Javascript 中的第一个 class 个对象,可以直接 作为值 传递。你实际上应该简单地接受一个函数作为回调:
$.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));
如果acItem
可以接受一个函数作为参数,你只需要像这样给它:
$('.search-item').acItem(Agency.registerAgency.addItem);
这样给函数是不会执行的。你只给函数,你不执行。