• 締切済み

複数の無名関数を合成したい

javascriptにおいて、無名関数を合成する方法を知っている方はいらっしゃるでしょうか? var func1 = function(){     alert('func1'); } var func2 = function(){     alert('func2'); } この二つの関数を合成して、 var func3 = function(){     alert('func1');     alert('func2'); } という風に合成したいのです。 jQueryを利用して var func3 = $.extend(func1, $func2); と試しましたが、func3 == func1 となってしまうようです。 また、単純に、var func3 = func1 + func2; では、 func3 = function(){alert('func1');}function(){alert('func2');} と意味を成さないものになってしまいます。

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.6

ANo5です。 連投失礼。 >実行時エラーなどは発生していないことは確認済みです。 実行時にエラーが出なければ、正しく処理されているということで、問題ないはずではないですか? 単純に、関数が渡されていないとか、あるいは、UIdialogの引数指定が違っているとか…(←これに関しては、知りませんので不明です。)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.5

ANo4です。 デバッガを使っていらっしゃるのであれば、   click: function(){ callback(); closeFunc(); } とした時にどこで止まっているかやエラーの原因等を特定できると思いますが、構文エラーやcallbackのタイプエラーではなく、違うことが原因となっているのではないのですか? どうも、ご質問なさっていることの他に原因がありそうに思います。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.4

ANo3です。 >そのコードは検証済みですねぇ。 単に、動作しないことから「合成できていない」と判断していませんか? これまた想像ですが、合成の問題ではなく、関数の実行時にエラーがでている可能性が高そうなきがします。 ANo3にも書きましたが、thisの値などを再チェックしてみてはいかがでしょうか。

kosukejlampnet
質問者

補足

もちろんFireBugなどのツールやデバッガを利用して実行時エラーなどは発生していないことは確認済みです。 object Function.prototypeなどの値もダンプしたうえでの話なので・・・。 $(this)は$("#dialog-confirm")等価ですので、$("#dialog-confirm")に置き換えた上での実行も検証済みです。そしてまた、そこが動作の結果に関わっていないことも検証済みです。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

A No1、2です。 jQuery UIdialogの仕様を知らないので、推測での回答ですが、 buttonsのオプションが、表示テキストとクリック時のハンドラーを指定しているのだとすれば、  click: function(){ callback(); closeFunc(); } でよいのではないでしょうか。 closefuncのthis値に何が渡されるのかは、コードからだけでは不明ですが…

kosukejlampnet
質問者

補足

そのコードは検証済みですねぇ。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

A No1です。 jQuery UIdialogの仕様はぞんじませんが、 >一つ目の関数(func1)はui dialogの外から、func2は関数の定義の中で との内容から想像するところ、無名関数や関数合成の問題ではなく、関数(変数)のスコープの問題ということではないでしょうか。 多分、合成しようとするのではなく、func1を参照可能なように工夫すればよろしいのではないでしょうか。

kosukejlampnet
質問者

補足

参照可能なように、引数で渡しています。 具体的にコードを見ていただくと一番いいと思いますので、下に示します。 目的はconfirm()をjQueryUiDialogでオーバーライドするのが目的です。 window.confirm = function(str, callback){ if (0 == $("#dialog-confirm").length) { var closeFunc = function(){$(this).dialog( "close" );} $("body").append("<div id=\"dialog-confirm\"><p></p></div>"); $("#dialog-confirm p").html(str).parent().dialog({ modal: true , buttons: [ { text: "OK", click: closeFunc } , { text: "キャンセル", click: closeFunc } ] }); } $("#dialog-confirm").children("p").html(str).end().dialog('open'); } ここで問題になっているのが、引数のcallbackとcloseFuncを「OK」ボタンのクリック時に実行したいのです。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

単純に、 var func3 = function(){     func1();     func2(); } という意味とは違うことなのでしょうか。

kosukejlampnet
質問者

補足

そうですね。実はこのfunc3を引数で渡し、jQuery UI dialogのbutton : { click: func3 }で実行したいのですが、一つ目の関数(func1)はui dialogの外から、func2は関数の定義の中で定義したいのです。