javascript関数のfunc.arityで引数の個数がundefinedと表示される問題

このQ&Aのポイント
  • javascriptの関数オブジェクトのfunc.arityは、関数が要求する引数の個数を返すプロパティです。
  • しかし、一部のブラウザではこのプロパティがサポートされていないため、undefinedと表示されることがあります。
  • この問題を回避するためには、代わりに関数のlengthプロパティを使用するか、引数の個数を手動で取得する必要があります。
回答を見る
  • ベストアンサー

func.arityで、undefined

とほほのjavascriptで勉強しているのですが http://www.tohoho-web.com/js/function.htm 関数オブジェクトのfunc.arityのところ 関数が要求する引数の個数を返します。 とあるのに、 function goukei(a, b, c) { return(a + b + c); } n = goukei.arity; document.write(n); このコードを書いて実行しても 引数の個数の3ではなく、undefinedが表示されます。 ちゃんと引数は3個だし、functionで定義した関数も、document.write文の前に宣言してあり ぱっとみ問題ないように思われるのですが、どうしてundefinedと表示されるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.3

Function.arity(JavaScript 1.2 で導入)は JavaScript 1.4 で廃止されています。JavaScript 1.1 からある Function.length の方が標準です。 ついでながら、Function.arguments も JavaScript 1.4 で廃止されています。おまけながら、Function のプロパティではない方の arguments.caller も JavaScript 1.3 で廃止されています(ECMAScript 5 で復活しましたが、strict mode では使えません)。 余談ながら、arguments.callee も ECMAScript 5 の strict mode では使えません。Arguments オブジェクトは高速化と安全性のネックになるため、遠ざけられた形になっています。もし再帰をしたければ名前付き関数を使います。 そういうわけで、「とほほ」はあまりおススメしません。ECMAScript 5 とは言いませんが、最低限 ECMAScript 3(JavaScript 1.5、JScript 5.5)相当の解説を探して下さい。

orangebanana
質問者

お礼

回答ありがとうございます。 ややこしいんですね。 各ブラウザによって違う挙動や、さらにjavascriptのバージョンによっても違うんですね。 Javaより記述が容易だな。習得しやすそうと思っていたjavascriptですが こういったことに注意が必要なんですね。 とほほでは、もう正規表現まで学習がすすんでしまっているので、 とりあえず、突っ走ろうと思います。 とほほのコードは、古い可能性が高いことを頭に入れて、書いているコードが動かなくても あまり気にせず、学習だけはしようと思います。

その他の回答 (2)

回答No.2

func.arity (N4) 関数が要求する引数の個数を返します。 N4 ってことは、Netscape Navigator 4 の事だと思いますが、現在では使われていないブラウザです。 function goukei(a, b, c) { return(a + b + c); } n = goukei.arguments.length; 上記のように変更してください。 まあ、JavaScriptには方言があるんだと思ってください。 つまり、goukei.arity はNetscape Navigator 4 にしか通じない命令文ということです。

orangebanana
質問者

お礼

回答ありがとうございます。 N4ってNetscapeのことだったんですね。 どうりで、ChromもIEでもできないわけですね。 javascriptってブラウザによって挙動が違ったりするみたいだから要注意ですね。 function goukei(a, b, c) { return(a + b + c); } n = goukei.arguments.length; document.write(n); これを実行してみましたが。 ブラウザは真っ白でした。 どうみても、どこも問題ないコードだと思うので、今回はこれでよしということにしようと思います。

回答No.1

arityをサポートしていないからじゃないでしょうか。

orangebanana
質問者

お礼

回答ありがとうございます。 サポートしてないというのは 私は、Chromで実行しているのですが ブラウザであるChromがarityをサポートしていないということでしょうか。 試しに、IEでも、このコードを実行しましたが undefinedと表示されてしまいます。 何かサポートするには設定しなければいけないのでしょうか。

関連するQ&A

  • 引数なしの関数で疑問です

    とほほのjavascriptで勉強しています。 http://www.tohoho-web.com/js/function.htm#objFunction ここの function goukei() { var ans = 0; for (i = 0; i < goukei.arguments.length; i++) { ans += goukei.arguments[i]; } return(ans); } sum = goukei(1, 2, 3, 4, 5); goukei関数を定義したときの引数は、なしなのに goukei関数を呼び出すとき、goukei(1, 2, 3, 4, 5)と、このように5つも引数を指定しています。 Javaでは、こんな呼び出し方をすれば、コンパイルエラーになりますよね。 javascriptでは、引数なしで関数を宣言しても、呼び出すときに、好きな個数の引数を渡せるのですか? 「javascript 引数 省略」とか、「javascript 引数なし」とかいろいろググッてみたのですが 肝心の、javascriptでは引数なしにして宣言しても、呼び出すとき、好きな個数の引数つけて呼び出しても大丈夫。みたいな、確認したい記述はみつかりませんでした。 javascriptでは、このような書き方もできるということでしょうか。

  • なぜfunc()で動き、funcで動かないのか。

    以前良く似た質問をしましたが、また疑問点が出たので質問します。 前回は、以下のコードでなぜonload = funcで動作し、onload = func()では動作しないのかをお聞きしました。 var img = new Image(); window.onload = function() { img.onload = func; } function func() { (省略) } その結果、funcだと関数を指定し、func()だと関数の返り値を代入するという答えを頂きました。 しかし自分で実験してみたところ、以下のコードでは逆の結果になりました。 window.onload = function() { document.getElementById("result1").onload = result1; document.getElementById("result2").onload = result2(); } function result1() { document.getElementById("result1").innerHTML = "result1"; } function result2() { document.getElementById("result2").innerHTML = "result2"; } <div id="result1"></div> <div id="result2"></div> onload = result2()の方は期待通りの結果が得られましたが、onload = result1ではdiv要素に文字列は挿入されませんでした。onloadによって実行される関数をfunc形式で指定したのになぜ動作せず、func()形式のもののみ動作したのでしょうか? あと蛇足になりますが、このようなコードも試してみましたが、どちらもうまくいきませんでした。 window.onload = function() { document.getElementById("result1").onload = result1; document.getElementById("result2").onload = result2(); } function result1() { this.innerHTML = "result1"; } function result2() { this.innerHTML = "result2"; } <div id="result1"></div> <div id="result2"></div> 両方のfunction内のthisはdocument.getElementById("result1")またはdocument.getElementById("result2")を指すのではないのでしょうか?

  • 引数に関して

    例えば、 C,B(C),A(B)という3つの関数があるとき、 それぞれをfunctionで書こうとすると、 Bの引数は-(C) Aの引数は-(B) でいいのでしょうか!? Aのルーチンには見た目上Cはでてこないので(CはBに包括されているため)、引数はBだけでいいのでしょうか?(☆部分) 説明不足で伝わっていないといけないので、サンプル載せときます。 ☆ function func_A(B) or (B,C) implicit none real*8 func_A,func_B,B,val * B=funcB(C) * val=(1.0d0-B)*3.0d0+B*7.0d0 func_A=val return end ------------------------------------- function func_B(C) implicit none real*8 func_B,func_C,C,val * C=func_C * val=C+5.0d0 func_B=val return end ---------------------------------- function func_C implicit none real*8 val * val=3.0d0 func_C=val return end ------------------------- Aの引数としてCも載せるのが正しい気がしますが、自信がありません。ご意見聞かせて下さい。

  • func関数は、どのような動作をするのでしょうか

    http://www.tohoho-web.com/js/statement.htm ここの、■ ラベル(label)の章でつまづいています。 label1: for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (func(i, j) { break label1; } } } 上のようにサイトでは書いてあるのですが、どのような処理になるのか目に見えるように label1: for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { xx = i * 10 + j; if (func(i, j) { break label1; } document.write(xx); } } このように、コードを付け加えたのですが、実行しても何も表示されません。 (func(i, j) の部分がカッコが抜けているのでわと思い、(func(i, j))にしたのですが 実行しても何も表示されません。 そもそもfuncは何かをネットで調べたのですが、functionばかり検索にひっかかり、結局 なんなのかわかりませんでした。 http://www.scollabo.com/banban/jsindex/index.html ここのリファレンスをみてもfuncは見当たりません。 そもそもfunc(i, j)はどのような意味なのでしょうか。

  • 処理のしくみがわかりません・・・

    以下のスクリプトはfor文による繰り返し処理の例です。 <script type="text/javascript"> <!-- var a="あ"; var b=new Array("い","う","え","お"); function FUNC1(){ for(i=0;i<b.length;i++){ a=a+b[i]; } document.write(a); } function FUNC2(){ for(i=0;i<b.length;i++){ document.write(a=a+b[i]); } } //--> </script> FUNC1の関数を実行すると、「あいうえお」、 FUNC2の関数を実行すると、「あいあいうあいうえあいうえお」 と表示されるのは理解できます。 それで試しにこのスクリプトの最後に、 FUNC1()+FUNC2(); を追加したところ、 「あいうえおあいあいうあいうえあいうえお」 と表示されると思いきや、 「あいうえおあいうえおいあいうえおいうあいうえおいうえあいうえおいうえお」 と表示されました。 どうもFUNC2を足す時、グローバル変数 a が "あ" ではなく、 "あいうえお" と代入されて実行されてるみたいです。 そして、FUNC1、FUNC2を実行すると、それぞれ 「あいうえおいうえおいうえお」 「あいうえおいうえおいあいうえおいうえおいうあいうえおいうえおいうえあいうえおいうえおいうえお」 と、理解不能の文字の並びになってしまいました。 なぜ FUNC1()+FUNC2(); を追加したらそれぞれの関数の実行値が変わってしまったのでしょうか? その処理の仕組みをご教授お願いいたします<(_ _)>

  • 関数を引数とする方法?

    いつもお世話になっています。 MFCでプログラムをしています。 今、任意の関数(Func1)を 積分する関数(Func2)を作っています。 現在は、被積分関数の数だけ、 積分関数(Func2)を書いているのですが、 非効率的なので、なるべく汎用性を持たせたいと 考えています。 参考書(新C言語入門シニア編)の該当個所で、 クラスでない通常の関数を引数とする場合は、 うまくいったのですが、 クラスのメンバ関数を引数とした場合、 どうしてもコンパイルエラーが 発生してしまいます。 関数Func、I及びエラーメッセージは大凡次のとおりです。今のところ、引数とする関数(Func1)の引数は、 同一個数としています。 <被積分関数の例> double ClassA::Func1 (double a){ return a * 10; } <積分関数> double ClassA::Func2 (double (*f)(double), double a, double b){ return b * f(a); } void classA::Integration() { ... Func2(Func1,a,b); ... } <エラーメッセージ> classA::Integrationの呼び出し箇所で、 「1番目の引数を double(double)からdouble(__cdecl)(double)に 変換できません」 と出ます。 double(double)の部分は合っているようなのですが、 (__cdecl)の部分が違うということまでは 分かりました。 メンバ関数であることが原因のようなので、 Func2での引数宣言を double ClassA::Func2 (double (ClassA::*f)(double), double a, double b){ return b * f(a); } に変えてみたところ、 引数受け渡しのところはクリアするのですが、 Func2(Func1,a,b); の呼び出し時に、Func2が関数ではないという エラーがでます。 アドバイス又は参考URL等を 教えていただければ助かります。 よろしくお願いします。

  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • 引数を利用したい

    いつもお世話になっています。 さて、早速ですが 送られてきた、引数を値として使えないのでしょうか? <td><input type="checkbox" name="C1" value="1" onChange="func(C1)"></td> <td><input type="text" name="create_date"></td> <td><input type="text" name="transaction"></td> 上記HTML中のチェックボックスのname属性値を引数にfunc関数に渡しています。 function func(str) { document.form1.str.click(); } func関数内で渡された引数を、str変数に入れてそれを値として使いたいのですが、うまくいきません。 document.form1.str.click(); を document.form1.C1.click(); とするとうまく動きます。 よろしくお願いします。

  • [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関数を定義できるのでしょうか。

  • VBで、関数を関数の引数にするは?

    VBで関数の引数に、関数を呼ぶにはどのようにすればいいでしょうか?  例えば以下のようなイメージです   DEF FUNC1(X)=X^2   DEF FUNC2(F,a,b)=F(a)+F(b)     関数FUNC2では、関数Fを引数にする     つまりFUNC2(FUNC1,1,2)は     FUNC1(1)+FUNC1(2)=1^2+2^2=5 こんな感じです。 お教えください。

専門家に質問してみよう