我想将一组在调用时运行的闭包存储到一个数组中。
eval 是最好的方法吗?
“评估是邪恶的”;-)
但这是一个可能的解决方案
Array.prototype.execute = function() {
for ( var i in this ) {
if ( i && 'execute' != i && Function == this[ i ].constructor ) {
this[ i ].apply( this );
}
}
};
var arr = [];
arr.push( ( function() {alert('A'); } ) );
arr.push( ( function() {alert('B'); } ) );
arr.push( ( function() {alert('C'); } ) );
arr.execute();
请记住:不建议像我那样扩展基本的 Javascript 类型。
您可以即时创建函数并将引用存储在变量中:
var something = function() { alert("hello world"); };
并在数组中扩展:
var something = [function() { alert("hello world"); },
function() { alert("hello world"); },
function() { alert("hello world"); }];
例如,您稍后可以something();
在第一个示例或something[1]();
第二个示例中使用它来调用它。这里绝对不需要 Eval,除非函数的实际主体来自用户输入(上帝禁止 :-))
什么以及如何调用它留给实现,但是一旦你意识到这一点,它应该是相当微不足道的。
好的,因为每个人都在猜测你真正在寻找什么,所以这是我的 .02:
var closures = (function(Global,undefined)
{
var that = [];//return value
that[0] = (function(some,vars, forClosure1)
{
return function()
{
console.log(some, vars,forClosure1);
};
})(values,of,closureArguments);//create all closures you need
that.execAll = function (context,args)//the method to call them all (with arguments)
{
context = (context === undefined || context === Global ? that : context);
args = args.length ? args : [];//make sure arguments has length property
for (var i=0;i<that.length;i++)
{
if (typeof that[i] === 'function')
{
that[i].apply(context,args);
}
}
};
return that;//return closure array (with execAll method)
})(window);
现在,我创建了一个闭包数组,它有自己的方法execAll
,您可以向该方法传递 2 个参数:第一个确定调用数组的 closre 函数的上下文,第二个需要一个数组或参数对象传递给这些闭包函数中的每一个。
就目前而言,闭包不能在全局上下文中使用execAll
. 这只是为了安全,但你永远不知道,也许你可能想在全局对象的上下文中调用它们。
总而言之,我认为这就是您正在寻找的东西,尽管我必须承认:我正在努力看看这段代码有什么用处,但也许这只是我。
无论如何:祝你好运
我不确定“调用时运行”是什么意思,但是由于数组是对象,因此您可以将静态信息作为对象键存储在数组中:
var arr = ['foo','bar'];
arr.methods = {
foo: function() { alert(this[0]); },
bar: function() { alert(this[1]); },
};
arr.run = function() {
for (var fn in this.methods) {
this.methods[fn].call(this);
}
};
arr.run();
您也可以使用原型继承将其变为可重用函数,但您需要将数组嵌入其中,因为数组在 javascript 中不是“可子类化”的。