電子書籍の厳選無料作品が豊富!

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');}
と意味を成さないものになってしまいます。

A 回答 (6件)

ANo5です。

 連投失礼。


>実行時エラーなどは発生していないことは確認済みです。
実行時にエラーが出なければ、正しく処理されているということで、問題ないはずではないですか?

単純に、関数が渡されていないとか、あるいは、UIdialogの引数指定が違っているとか…(←これに関しては、知りませんので不明です。)
    • good
    • 0

ANo4です。



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

どうも、ご質問なさっていることの他に原因がありそうに思います。
    • good
    • 0

ANo3です。



>そのコードは検証済みですねぇ。
単に、動作しないことから「合成できていない」と判断していませんか?

これまた想像ですが、合成の問題ではなく、関数の実行時にエラーがでている可能性が高そうなきがします。
ANo3にも書きましたが、thisの値などを再チェックしてみてはいかがでしょうか。

この回答への補足

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

補足日時:2013/06/16 15:08
    • good
    • 0

A No1、2です。



jQuery UIdialogの仕様を知らないので、推測での回答ですが、

buttonsのオプションが、表示テキストとクリック時のハンドラーを指定しているのだとすれば、
 click: function(){ callback(); closeFunc(); }
でよいのではないでしょうか。

closefuncのthis値に何が渡されるのかは、コードからだけでは不明ですが…

この回答への補足

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

補足日時:2013/06/16 11:19
    • good
    • 0

A No1です。


jQuery UIdialogの仕様はぞんじませんが、

>一つ目の関数(func1)はui dialogの外から、func2は関数の定義の中で
との内容から想像するところ、無名関数や関数合成の問題ではなく、関数(変数)のスコープの問題ということではないでしょうか。

多分、合成しようとするのではなく、func1を参照可能なように工夫すればよろしいのではないでしょうか。

この回答への補足

参照可能なように、引数で渡しています。
具体的にコードを見ていただくと一番いいと思いますので、下に示します。
目的は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」ボタンのクリック時に実行したいのです。

補足日時:2013/06/16 02:03
    • good
    • 0

単純に、



var func3 = function(){
    func1();
    func2();
}

という意味とは違うことなのでしょうか。

この回答への補足

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

補足日時:2013/06/16 00:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!