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

白石俊平(あゆた)
2008-01-10 18:00:00
  • このエントリーをはてなブックマークに追加
最新特集【一覧】

 JavaScriptをより深く知りたい人のための当連載、今回が実質的な二回目です。

 前々回のイントロダクション では、「当連載がどういった読者を対象にしているか」「連載の大まかなあらすじ」をお伝えしました。

 また前回 は、JavaScriptの現状を知っていただくためにその歴史や業界地図の説明を行いました。

 今回からいよいよ、JavaScriptという言語自体にスポットを当てて行きたいと思います。「高度なJavaScriptエンジニアたちは何を理解し、どんなコードを書いているのか」をご理解いただけるよう頑張っていきたいと思います。

今回のお題

 JavaScriptプログラマにとって、「関数を定義する」と言えば普通はこのように書きますね。

function a() {
  alert("こんちは");
}

 しかし、関数定義を次のように書く/書いたことがある、と言う人の数を聞くと、ぐっと絞り込まれてしまうのではないでしょうか。

var a = function () {
  alert("こんちは");
};

 今回の話題は、これら2つのコードが等価であり、そのことを理解することがJavaScriptを深く学ぶ上での第一歩である、というお話をしたいと思います。

関数はオブジェクトだ

 上で述べたことの本質を一言で表すなら、「関数はオブジェクトである」と言うことになります。

 JavaScriptにおける「オブジェクト」とは何なのか、については次回詳しくお話します。なので、ここで言うオブジェクトとは「データと振舞いをひとまとまりにしたもの」という程度にとどめておきます。

 オブジェクトは、Javaに代表されるオブジェクト指向言語では基本的な単位の一つで、変数に代入したり、メソッドの引数/戻り値に使用することもできます。

 そしてJavaScriptでは「関数もオブジェクト」なので、関数に対してそうした操作 (代入や引数、戻り値など) を行うことが可能です。以下でそれを試していきましょう。

  • コメント(3件)
#1 D298   2008-01-19 12:25:08
関数がオブジェクト、という概念はC言語の関数ポインタになぞらえると理解しやすい?かも。
クロージャは関数が使うヒープ領域が関数ポインタに紐付いて管理されている、と考えるといいのでしょうか?関数オブジェクト用のメモリを開放しないでallocしっぱなしと考える・・・となんとなく把握しやすいような?
#2 moscript   2011-03-06 09:07:22
 最初のHTMLの例文のタグがエスケープされていないのでコードが実行され、ページのHTMLを読まないとコードを読むことができません。修正を希望します。
#3 moscript   2011-03-06 09:13:30
 読み進めているうちにさらに気付きました。
 例文として挙げているJavaScriptをそのまま実行コードとして実行させているようですが、これはあきらかに望ましくありません。Webコンテンツで実行させるJavaScriptは実行用コードとして書き、例文はエスケープしてちゃんと例文として扱うべきです。
 例文がコードがまったくエスケープされていないので、一般的なブラウザでは例文を読むことができません。くどいですが修正を希望します。
  • 新着記事
  • 特集
  • ブログ