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("こんちは");
};
関数オブジェクトを引数にする
では「『関数』と言うものが持ち運び可能なオブジェクトだ」、と言うことを理解したところで、少し応用を働かせてみましょう。
- 特集: JavaScriptのイロハ (17件)
- 今日のトップ記事
- 2日前
- 4日前
- 6日前
- 7日前
- ホワイトペーパー
- 読者投票
今、使っているマシンのOSは?
- 話題のタグ
Linux
iPhone 3G
server
Ajax
Firefox
PHP
Leopard
開発環境
ライブラリ
HTML
CSS
Microsoft
Adobe
Off Topic
Apache
Windows
仮想化
フレームワーク
Python
JavaScript
Opera
オープンソース
Solaris
Database
iPhone
小技
入門
Apple
Safari
RIA
Firefox 3
Ruby
SOA
ブラウザ
Tips
Flash
C/C++
Webアプリケーション開発
iPod touch
Java
Mac OS X
リファレンス
Webデザイン
XHTML
Eclipse
Google
Mozilla
MySQL
イロハ
Internet Explorer
話題のタグを見る »
MS、Vistaとの互換性をチェックできる「Compatibility Center」リリースへ
「似非」SOAを見破る10の方法
Firefox 3のアドオンやテーマ管理を容易にする
openSUSE 11.0を試してみた
フォトレポート:世界各国の優秀な技術者がパリに集結--Imagine Cup 2008世界大会
バッチ処理でデータベース活用:4つの課題と5つの解決ポイント
Rubyでどう書く?:RubyでWord文書を作成する
今知るべき仮想化情報
「未来の、その先」をどう提言していくか
ZDNet Japan Green IT
Techno Exchange
DELL連載第4回〜「Microsoft System Center」