呼び出されたときに実行される一連のクロージャーを配列に格納したいと思います。
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 型を拡張することはお勧めしません。
わかりました。皆さんが実際に探しているものは何かを推測し続けるので、ここに私の .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 つの引数を渡すことができます。1 つ目は、配列のクローズ関数が呼び出されるコンテキストを決定し、2 つ目は配列または引数を期待します。これらの各クロージャー関数に渡すオブジェクト。現在のところ、を使用してグローバル コンテキストで
クロージャを呼び出すことはできません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 で「サブクラス化」できないため、その中に配列を埋め込む必要があります。
その場で関数を作成し、参照を変数に保存できます。
var something = function() { alert("hello world"); };
そして、配列の拡張により:
var something = [function() { alert("hello world"); },
function() { alert("hello world"); },
function() { alert("hello world"); }];
something();
たとえば、最初の例または2番目の例で使用して、後で呼び出すことができsomething[1]();
ます。関数の実際の本体がユーザー入力に由来しない限り、ここでは Eval は絶対に必要ありません (神は禁じます :-) )
何をどのように呼び出すかは実装に任されていますが、これを知っていればかなり簡単です。