2012-03-20 7 views
0

として変数を持つ関数の参照を渡します。は、私は次のJavaScriptの方法を持っているその名

function 123_test_function(){ 

} 

機能は、Javaによって生成され、クライアントに送信されます。 123はコンポーネントのIDなので変更できます。すなわち私は111_test_function()と呼ばれる別の機能を持つことができます 私は参照としてこの関数を渡したいと思います。

だから私は、私はそうのような123_test_functionの参照を使用する必要がある機能を持っているオブジェクト内の別のjsファイルで

var 123_test_function = function 123_test_function(){ 

} 

参照を作成する必要があります:私は「問題

useFunction(123_test_function); 

関数の一部に123が含まれています。 このオブジェクトには、関数の先頭に数値を持つ変数(uniqueID)があります。これは、それが文字列を渡す代わりに関数を渡すようには見えない

useFunction(uniqueID+"_test_function"); 

: は、私のようなものにするために、関数呼び出しを必要としています。 何か間違っていますか?

+8

(http://es5.github.com/#x7.6) –

+0

申し訳ありませんああ、私は一例として123を使用:私はあなたがこのようなあなたの関数を作成することをおすすめ[識別子は数字で始めることはできません。]このポストでは、変数は実際には数字ではありません。 – Decrypter

答えて

3

1つの場合、識別子(関数名など)は数字で始めることはできません。

はあなたの問題を解決するために、このように、オブジェクトを使用します。

// 1. define an object to hold all your functions 
var allFunctions = {}; 

// 2. store any function with a unique string as the ID 
allFunctions['123_test_function'] = function() { 
    // whatever 
}; 

// 3. call the function 
allFunctions['123_test_function'](); 
allFunctions[uniqueID + '_test_function'](); 

オブジェクトが連想配列です。キーと値のペアが格納されているので、ここで必要なものとまったく同じです。関数はJavaScriptで名前を必要としないので、私は人々のカップルとしてステップ2

0

関数がグローバル関数として定義されている場合、関数はグローバルオブジェクト(ブラウザの場合はwindow)のメンバーになります。したがって、あなたは自分の機能にアクセスするためにwindow['id_'+uniqueID+'_test_function']を行うことができます

useFunction(window['id_'+uniqueID+'_test_function']) 

(私は'id_'接頭辞を追加した識別子は、JavaScriptでの数字で始めることはできません。あなたはもちろん、あなたの好みに合わせてそれを変更することができます。)

+0

これは正解です。 また、この例では、関数名が変数を持つ前に文字列を正しく付加するか、関数名を数値で始めるべきではありません – elmuchacho

0
function test_function(number){ 
    if(number == 1) 
    { 
    return function() {} 
    } 
    if(number == 2) 
    { 
    return function() {}  
    } 
} 

このような関数を呼び出す

var func = test_function(1) 
func(); 
0

での使用していませんでした

注意が正しく、機能性を指摘している(または実際には変数)の名前を開始することはできません数値で。また、この構文は間違っている:

var 123_test_function = function 123_test_function(){ 
} 

正しい構文は次のようになります。

var 123_test_function = function() { 
}; 

...それはまた、この効果は正確に

「伝統」と同じであることに留意すべきであるが、
function 123_test_function() { 
} 

...宣言、windowオブジェクトのコンテキストで - windowは実質的にブラウザのJS環境のグローバルスコープであるため、関数の定義方法は問わず、いつでもどこからでもアクセスできます。幸いなことに、Douglas Crockford to the rescueがもう一度...

文字列のコンテキストから呼び出すためのさまざまな方法が提案されています。これは基本的には使用しようとしています"可変変数"シンタックスは、on SOelsewhereで議論されています。可能であればeval()のアプローチは避けてください。eval()チャンスが必要な場合は、間違ったところに行ったことがあります。 @Tomalakは、オブジェクトに保持されている関数のコレクションで適切なアイデアを持っていますが、数値IDによって実際にアクセスされているものを参照するには、やや乱雑な文字列アプローチが必要です。コレクションのアプローチは、windowオブジェクトをシングル/ゼロ使用メンバーである可能性があるものと混乱させないという利点があります。

しかし、私が実際に必要とするのは、インデックス付きの関数配列です。関数にアクセスするには、数値インデックスが必要です。

// Do this once at the top of your JS 
var test_functions = []; 

// Now, for each function you define: 
test_functions[123] = function() { 
    // Do stuff here 
}; 

// And when you need to call the functions: 
var funcId = 123; 
test_functions[funcId](); 
関連する問題