1

最後の質問でごめんなさい。これは、より適切なフォーマットの質問です。

メソッドを渡すメソッドがあります:

method("my_passed_method()")

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

しかし、これは戻ります:

SyntaxError: missing ] after element list

これは単なるJSON構文エラーだと思います。

4

4 に答える 4

4

おそらくこれが必要だと思います:

method(my_passed_method)

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

を呼び出しているときは、文字列ではなく関数参照methodを渡していることに注意してください。呼び出しいるわけではありません (その後に何もありません)。参照しているだけです。 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);

ライブコピー| ソース

于 2012-04-05T15:21:13.690 に答える
2

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

method(my_passed_method)

function method(passed_method){
    passed_method();
} 

それで、ここで何が起こっているのですか?name を渡すとmy_passed_method、JavaScript エンジンはその名前が何にマップされているかを調べ、関数オブジェクトにマップされていることを検出します。メソッドの関数呼び出し内では、そのオブジェクトはパラメーター名 `passed_method. この名前の後に括弧を付けると、JavaScript がそのオブジェクトを実行しようとします。これは、このオブジェクトが関数であるため実際に可能であり、他の型と同様に、関数はファースト クラス シテゼンと呼ばれるものです。を変数に割り当てて渡すことにより、他の値と同じように扱うことができます。

于 2012-04-05T15:21:12.320 に答える
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として評価するため、出力が異なる場合があることに注意してください。

于 2012-04-05T15:23:33.053 に答える
0

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

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

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

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

pass(something); //alerts hello

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

于 2012-04-05T15:22:34.363 に答える