0

我想将一组在调用时运行的闭包存储到一个数组中。

eval 是最好的方法吗?

4

4 回答 4

2

“评估是邪恶的”;-)

但这是一个可能的解决方案

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 类型。

于 2012-10-28T12:39:36.157 回答
0

您可以即时创建函数并将引用存储在变量中:

var something = function() { alert("hello world"); };

并在数组中扩展:

var something = [function() { alert("hello world"); }, 
                 function() { alert("hello world"); }, 
                 function() { alert("hello world"); }];

例如,您稍后可以something();在第一个示例或something[1]();第二个示例中使用它来调用它。这里绝对不需要 Eval,除非函数的实际主体来自用户输入(上帝禁止 :-))

什么以及如何调用它留给实现,但是一旦你意识到这一点,它应该是相当微不足道的。

于 2012-10-28T13:01:14.460 回答
0

好的,因为每个人都在猜测你真正在寻找什么,所以这是我的 .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. 这只是为了安全,但你永远不知道,也许你可能想在全局对象的上下文中调用它们。

总而言之,我认为这就是您正在寻找的东西,尽管我必须承认:我正在努力看看这段代码有什么用处,但也许这只是我。
无论如何:祝你好运

于 2012-10-28T13:22:36.433 回答
0

我不确定“调用时运行”是什么意思,但是由于数组是对象,因此您可以将静态信息作为对象键存储在数组中:

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 中不是“可子类化”的。

于 2012-10-28T12:49:41.320 回答