• 締切済み

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

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は関数の定義の中で定義したいのです。

関連するQ&A

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • function()は無名関数?

    jqueryの$(function() は無名関数だと思いますが、redyが省略されているので、DOMを読み込み終わってから実行とも聞きます。 両方の意味があるのでしょうか? 一見ダダの無名関数に見えますがどのように区別するのでしょうか? 下記の部分もfunction()があるのですがこちらもまた無名関数のなのですか? ただ即時関数ではないので変数などに入れて、関数の呼び出しをしないといけないのにその記載がなくても実行されるのはなぜでしょうか? each(function() $(function() { $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); } }).blur(function(){ if( $(this).val() =="" ){ $(this).val(labelText); } }); }); }); 補足 $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); の部分は無名関数の中身、つまりこの関数が実行されるときの中身のことなのでしょうか? jqueryだと何となくこの書き方をしているのですがJSの基礎で考えるとそのようになりますよね?

  • javascript無名関数から変数にアクセス

    お世話になります。 javascript初心者です。 無名関数からグローバル変数にアクセスしたいのですが 外で変数を宣言して、内でvar無しで代入してみたのですがうまくいきません どのようにすれば期待する結果になるのか、お忙しい中恐縮ですが 詳しい方お教えいただけないでしょうか //グローバル変数 var hoge; //dataTransfer処理省略 //html5のFileReader var reader = new FileReader(); reader.readAsDataURL(file); //ロードが完了したら無名関数にてhogeに結果を代入 reader.onloadend = function(e) {  hoge = e.target.result; }; alert(hoge); ■期待する結果 アラートで「結果」が表示される ■実際の結果 アラートで「」(空白)が表示される 無名関数内でalert(e.target.result);するとちゃんと結果が表示されるので FileReaderの処理は成功している模様です。 無名関数からグローバル変数にアクセスする方法を御存知の方 お教えいただけたら幸いです

  • jQuery 同じ処理を関数にまとめたい

    jQueryでプログラムを書いています。 同じ処理が複数出てきているので一まとめにしてて見やすくしたいのですが・・・・ やり方がわかりません。 たとえば、 $("#id1").on("click",function(){ var num1=1; var num2=2; var a; a=num1 + num2; alert(a); }) $("#id2).on("hover",function(){ var num3=3; var num4=4; var b; b=num3 + num4; alert(b) }) のようにほぼ同じ処理を違うイベントで行う場合です。 関数自体は作れるのですが、、、、 function calc(numa,numb){ alert(numa+numb); } jquery内でjavascript(Java?)の関数は使えないというのを聞いたことがあります。 どのようにすれば使ええるのでしょうか?

  • 無名関数?

    こんにちは jQuery.fileupload.jsのソースコードを覗いていたのですが いきなり下記のような書き方でコードが表示されていたのですが 意味が分からず悩んでいます。 ======================= (function (factory) { 'use strict'; :     : } (function ($, tmpl, loadImage) {     :     : })); ======================= 最初は無名関数が複数並んでいるのかと思い下記のように修正してみましたが エラーが発生してしまいました。 ======================= (function (factory) { 'use strict'; :     : }); (function ($, tmpl, loadImage) {     :     : }); ======================= 調べてみても上記の書き方をしているサイトが見つからず悩んでます。 ご存知の方がいたら無知な自分に教えて頂けますでしょうか。 よろしくお願いいたします。

  • jQueryのイベントに引数を渡したい

    例えば以下のような既存のJavaScriptのコードをjQueryのイベントで書き直したい場合、関数の引数で渡していた値は、どうやって渡すのでしょうか? 【html】 <a href="" onclick="func_a('abc'); return false;"></a> 【JavaScript】 faunction func_a(param_a){ alert(param_a); } 以下のようにすれば渡せないことはありませんが、かなり強引な感じがします。 【html】 <a href="" class="abc"></a> 【jQuery】 $(function() { $("a").click( function(){ var param = $(this).attr("class"); alert(param); return false; } ); }); こういう場合はjQeuryであっても、onclick属性で関数を呼び出すのが普通なのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願い申し上げます。

  • JavaScriptで関数設定時に引数を指定したい

    状況を説明します ・複数のthにoncklickイベントで同じ関数を呼びたい ・th要素のタグにonclick属性を書くのは同じ記述をたくさん書くことになるのでやりたくない ・JavaScriptでonclick属性に関数を設定したい ・th要素自身を引数としたい ※WindowsXPのIE8で動けばOKです。 (0)ベタ書きするとこんな感じになります。これなら動くことを確認しています。 # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # # function func1(th) { #   … # } (1)引数がなければこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = func1; # } (2)無名関数ならこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = function() { #     … #   } # } しかしこの2つの書き方「(1)(2)」とも、引数を入れようとしたところ どうすればいいかわかりませんでした。 上記の状況を踏まえ… 質問は以下です ・(1)のような書き方で、引数アリの関数を設定する方法 ・(2)のような書き方で、引数アリの関数を無名関数で設定する方法 ・それ以外の代替方法 これを教えてください。 そもそもJavaScriptではできないのであればその旨を教えてください。 よろしくお願いします。

  • なぜ関数をfuncで呼び出すのか。なぜfunc()ではいけないのか。

    画像の読み込み完了をトリガーとして動作する以下のような関数があります。 var img = new Image(); window.onload = function() { img.onload = func; } function func() { (省略) } img.onloadによって、画像の読み込みが完了したときに動作する関数を指定していますが、なぜfuncと書き、func()ではいけないのでしょうか?実際に試してみましたが、()をつけると動作しませんでした。()をつけないで関数を呼び出す方法を知らなかったので(無名関数を使う場合でさえ、変数名()という形を取るのに)、この理由が分からなくて困っています。どなたか教えてください。

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • jQueryでの、引数を取るJS関数の呼出方法

    jQueryの学習をしています。 HTML & JavaScriptで下記のように書かれているコード <input type=button id=button1 onclick=func_a() /> <script> function func1(){ //処理いろいろ } </script> は、jQueryを使って書くと、 $('#button1').live('click', func_a); このように書けます。 <input type=button id=button1 onclick=func_b(arg1, arg2) /> <script> function func_b(argument1, argument2){ //処理いろいろ } のように引数を取る関数は jQueryではどのように書けばよいのでしょうか? $('#button1').live('click', func_b(arg1, arg2)); とは書けなかったので、今は、 if (arg1 == xxx){ $('#button1').live('click', func_b_1_1); } else { $('#button1').live('click', func_b_1_2); } などのように引数別に同じような関数を創って書いています。 DRY原則という同じコードを二度書くなという約束もあるようなので、 きっといい方法があると思うのですが、 お詳しい方、教えていただけるとうれしいです。 どうぞ、よろしくお願いいたします。

専門家に質問してみよう