1

匿名関数を引数として受け取り、参照用に変数(スコープ)に設定する関数があります。次に、その参照を使用して別の関数を実行しようとしましたが、その関数がスコープ外であるため、明らかに失敗します。

スコープの問題を回避して、匿名関数を匿名関数として直接渡す簡単な方法を誰かが知っているかどうか疑問に思いましたか?

編集:明確にするために、el要素は関数が引数リストから分離された後に定義されます。さらに、el要素も引数リストの一部です。このコードを私だけが使用する場合は、2つの引数リストを使用し、2番目の引数は配列またはハッシュオブジェクトである可能性がありますが、残念ながら、このコードはJSやコーディングにあまり詳しくない人によって使用される予定です。そのことについては。

助けてくれてありがとう!

これが私のコードの関連部分です:

locate : function(){
  if ((!arguments)||(!arguments.length)) return;
  arguments = [].splice.call(arguments,0); //This just converts arguments into an array
  for (var i=0;i<arguments.length;i++){
    if (typeof(arguments[i])=='function'){
      var tf = arguments.splice(i,1);
      break;
    };
  };
  if (!tf) return;
  JAS.Globals.eventListen('click',el,tf);
}

これは省略されているので、elが定義されていることを信頼してください。JAS.Globals.eventListenは、単なるインテリジェントなaddEventListenerです。

4

3 に答える 3

3
 var tf = arguments.splice(i,1)

これは配列を tf に返します。eventListen は配列を期待していますか? 使用しない場合:-

 var tf = arguments.splice(i,1)[0]

他の引数に他の用途がないように見えるのに、なぜスプライスを使用しているのですか?

于 2009-01-09T16:43:49.873 に答える
0

できるよ:

for (var i=0;i<arguments.length;i++){
    if (typeof(arguments[i])=='function'){
        JAS.Globals.eventListen('click',el,arguments[i]);
        break;
    }
}

または、何らかの理由でループの後にイベントを割り当てる必要がある場合:

var tf;
for (var i=0;i<arguments.length;i++){
    if (typeof(arguments[i])=='function'){
        tf = arguments[i];
        break;
    }
}
if (!tf) return;
JAS.Globals.eventListen('click',el,tf);
于 2009-01-09T16:37:49.323 に答える
0

私は JS の専門家ではありません。これがあなたのケースに役立つかどうかはわかりません。

しかし、関数を「値で」渡す方法を求めているので、関数を再構成して、次のように再び匿名にすることができます。

JAS.Globals.eventListen('click', el,
    new Function(tf.toString() + tf.name + "();")

その最後の部分が行うことは、取得した元のソースから新しい関数を作成tf.toString()し、同じ関数名で関数の定義コードを出力しますが、作成しようとしている関数のスコープ内にあります。

そして、すぐにその関数を で呼び出しますtf.name + "();"

関数に名前がない場合は、インライン関数呼び出しとしてラップできることに注意してください。

new Function("(" + tf.toString() + ")();");

まとめ:

new Function(tf.name
    ? (tf.toString() + tf.name + "();")  // func has a name, call by name
    : ("(" + tf.toString() + ")();")     // func don't have a name, call inline

Firebug で試してみて、私の言いたいことを確認してください。

于 2009-01-09T16:52:16.503 に答える