JavaScriptのイロハ:「関数はオブジェクト」って理解できますか?

白石俊平
2008/01/10 18:00

今回はJavaScriptの「関数はオブジェクトである」という概念について考えてみます。

関数を変数として扱ってみる

 以下のプログラムは、まず関数「a」を通常の形式 ("function 関数名()"と言う形) で宣言しています。関数はオブジェクトなので、これはオブジェクトを一つ作っているということに他なりません。それを「init」と言う変数に代入し直して、body.onloadイベントで呼び出してみた例です。

<html>
  <head>
    <script type="text/javascript">
      function a() {
        alert("こんちは");
      }
      // 関数aを、変数initに代入
      var init = a;
    </script>
  </head>
  <!-- initを呼び出し -->
  <body onload="init()">
  </body>
  </html>

 この例から以下のようなことが分かります。

  • 「a」は代入文の右辺に来ていることからもわかるとおり、変数として扱える。つまりJavaScriptにおける「関数定義」とは、「a」と言う名前の変数に「実行可能な関数オブジェクト」を代入する処理だと考えられる。
  • 「a」を再代入された変数「init」も、後ろに「()」を付けることでふつうに関数として呼び出せる。つまり関数オブジェクト (この例では「a」と「init」) は、その後ろに「()」を記述することで関数本体を実行することができる。

この、「関数は再代入可能なオブジェクトである」「『関数名』は、関数オブジェクトを代入するための単なる『変数名』である」と言うことを理解すると、JavaScriptの本質的な姿に一歩近づくことができます。

無名関数

 上のコードは、通常の「function a()」という書式で"宣言"した関数をinitに"代入"していました。

 JavaScriptプログラミングでは、こうした「他の変数に関数を代入する」と言う処理は頻繁に行われます。そのたびに「宣言」と「代入」を別々に行っていたのでは記述が面倒ですね。

 そのため、JavaScriptでは「無名関数」を用いて、関数宣言をコンパクトに行う書式が用意されています。「無名関数」を作成するには以下のように記述します。

function () {
  // 関数の処理
}

 単に、functionキーワードの後に続く関数名を省略するだけです。この書式を用いて、上と同じく「initと言う変数に関数オブジェクトを代入する」と言うコードを書くなら、以下のようになります。

// 変数initに、無名関数を代入
var init = function () {
  alert("こんちは");
};

関数オブジェクトを引数にする

 では「『関数』と言うものが持ち運び可能なオブジェクトだ」、と言うことを理解したところで、少し応用を働かせてみましょう。

  • コメント(1件)

#1 D298  - 2008/01/19 12:25:08

関数がオブジェクト、という概念はC言語の関数ポインタになぞらえると理... 続きを見る
» 不適切なコメントを報告する
記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
  • 新着記事
  • 人気記事
  • 特集
  • ブログ
  • 読者投票
    今、使っているマシンのOSは?

    投票受付期間:2008年6月27日 〜 2008年7月11日
  • » 投票しないで結果だけ見る