2012-04-05 17 views
1

私の最後の質問に申し訳ありません。これはより良い書式設定の問題です。メソッドを呼び出さずに別のメソッドでメソッドを渡し、変数オブジェクトを渡します。

私は方法を通過しています方法があります。

method("my_passed_method()") 

function method(passed_method){ 
    eval(passed_method.replace('()', + '(' + obj + ')'); 
} 

をしかし、これは返します

SyntaxError: missing ] after element list

私は、これは単にいくつかの単純なJSON構文エラーであると仮定しています。

+0

コードに誤った+があります..... –

+1

ここで良い答えがあります。 JavaScriptのメソッド/関数では、他のオブジェクトのように他の関数に渡すことができるオブジェクトです。またevalは悪です。 –

答えて

2

メソッドの名前は、同時にそのメソッドオブジェクトへの参照です。括弧は、オプションでそれらの間にパラメータを入れて、javascriptでそのメソッドを呼び出します。つまり、コードを次のように書き換えることができます。

method(my_passed_method) 

function method(passed_method){ 
    passed_method(); 
} 

ここでは何が起こっているのですか? my_passed_methodという名前を渡すと、javascriptエンジンはその名前がどのマップにマッピングされているかを調べ、functioオブジェクトにマップすることがわかります。 メソッドの関数呼び出しの中で、そのオブジェクトはパラメータ名 `passed_method 'に割り当てられます。この名前の後にカッコを入れると、javascriptはそのオブジェクトを実行しようとします。このオブジェクトは関数であり、他の型と同じように関数はファーストクラスのcitezensと呼ばれます。他の値と同様に、変数に代入して渡すことで対応できます。

私はあなたがおそらくこのたいと思います
4

:あなたはmethodを呼び出しているとき、あなたは関数リファレンス、ない文字列を渡している、とあなたはを呼び出していないことを

method(my_passed_method) 

function method(passed_method){ 
    passed_method(obj); 
} 

は注意をmy_passed_method(それの後には()はありません)、あなたはただそれを参照しています。

methodの範囲内では、変数には関数参照が含まれているため、変数passed_methodで関数を呼び出します。

JavaScriptでは、関数はファーストクラスのオブジェクトです。 |

// The function we'll pass in 
function functionToPass(arg) { 
    display("functionToPass's arg is: " + arg); 
} 

// The function we pass it into 
function functionReceivingIt(func) { 
    func("foo"); 
} 

// Do it 
functionReceivingIt(functionToPass); 

Live copy:変数等

ここで完全な、自己完結型の例です、あなたの周りにそれらを渡すことができ、それらを参照することができますsource

0

In JavaScript関数はオブジェクトと見なされます。以下に示すように、それらをパラメータとして他の関数に渡すことができます。

function something(x){ 
alert(x); 
} 

function pass(func){ 
    pass2(func); 
} 

function pass2(func){ 
    func("hello"); 
} 

pass(something); //alerts hello 

デモ: http://jsfiddle.net/wBvA2/

0

evalは悪です。それで彼らは言う。あなたは、あなただけの関数自体を渡し、その後、引数を渡す(または単にそれを直接呼び出す)するFunction.callまたはFunction.applyを使用することができ、文字列としての機能を渡す必要はありません。

method(my_passed_method); 
function method(passed_method) { 
    passed_method(obj); 
    // OR: passed_method.call(window,obj); 
} 

evalが必要な状況非常にまれです。

あなたのコードはobjをjavascriptとして評価するので、出力が異なる可能性があります。

関連する問題