【コラム】
前回の記事では、無名関数を関数リテラルに割り当てるという操作を紹介した。なぜ、このような記法により関数を定義するのだろうか。
まず、無名関数を採用するメリットには、「命名する必要の無い関数をシンプルに記述できる」「(複数ファイルのJavaScriptライブラリを読み込んでいるときなどにおいて)、既存の関数/変数名との衝突を回避できる」という点が挙げられる。
前回の冒頭で述べた通り、JavaScript関連ライブラリが数多く存在し、多くのシーンでそれを活用している今日、既存のライブラリやソースコードと名前が衝突しない事がどれだけ重要であるかは想像に難くないだろう。
それでは、命名する必要の無い関数とはどのようなものだろうか。また、無名関数だと変数名の有効範囲はどのように決まっているのだろうか。ここで、前回に引き続きFirebugで以下のコマンドを実行し、動作を確認してみよう。
上記[例1]は、ウィンドウ内をクリックしたときのイベントハンドラプロパティに無名関数をバインドしている。クリックしたときの一連の処理の流れを定義しているだけなので、この関数に命名が不要であることは直感的に理解できるだろう。
上記[例2]では、無名関数内で定義された変数yが、外部の変数を上書きしていないことが確認できる。しかしながら、単に {} で囲んだブロック内での処理においては、変数は上書きされてしまう。このように、変数の有効範囲(スコープ)は関数内に閉じられる。外部のライブラリや前処理に関係なく、独立した一連の処理を行いたい場合に無名関数が有効であることが理解できるだろう。
[例3]は、さらに無名関数をその場で実行しているものだ。この書き方は、各種ライブラリの初期化処理などで多用されている。初期化処理(無名関数)内で多様な変数名が用いられたとしても、その外側で定義されている変数が影響を受けることは無い。
余談だが、関数リテラルの記法(表現)は関数型言語にもしばしば登場する。Lispなどの関数型言語を学んだことのある読者は、ラムダ関数(ラムダ式あるいはラムダ計算)について知っていることと思う。(ラムダ計算とは、計算量理論や数値論理学の分野で登場する概念であり、関数をギリシャ文字ラムダ(λ)を用いて表記するものである。詳しくは専門書籍等を参照されたい)。JavaScriptにおける関数リテラルの表記方法は、関数型言語にも見られる、このラムダ関数の表記方法と同じものである。
ラムダ計算の目的や意図するところをここで述べるのは本稿の主旨に外れてしまうため、この話題についてはここまで。ただ、JavaScriptにおいて、ラムダ関数表現が関数リテラルによって記述できることは、知っておいたほうがいいだろう。
なお、JavaScriptでの関数表現には、この他に、以下のようなものもある。Firebugで実行し、動作を確認しておこう。この表現に関する詳細な説明は、今回は割愛するが、今後たびたび登場するものであるため、機会を見て紹介していきたい。
前項では、無名関数による定義のメリットについて触れた。それでは、(無名)関数を関数リテラルとして定義するシーンとはどのようなときか、改めて考えてみよう。ここからは、さらに一歩進んで、JavaScriptによるオブジェクト指向プログラミングについて紹介していく。
JavaScriptでオブジェクト指向、とは馴染みの無い響きかもしれない。しかし、JavaScriptは立派なオブジェクト指向言語。関数型言語のようでいて、オブジェクト指向言語でもある。JavaScriptの面白さはこれからだ。
JavaScriptでのオブジェクト指向プログラミングに触れる前に、まずJavaScriptでのオブジェクト型について確認しておこう。Mozilla Developer CenterのCore JavaScript 1.5 Guideによれば、オブジェクト型の定義は以下のようになっている。
An object literal is a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}).
端的に訳すなら、「プロパティ名とそれに対応づけられた値のペアのリスト」ということになる。JavaやC++などでいうオブジェクトのように、属性(フィールド)と操作(メソッド)という言葉が登場していない事を確認しておこう。
さて、JavaScriptでのオブジェクトはJSON(JavaScript Object Notation)という表記法によって表現することができる。さっそく、Firebugで次のコマンドを実行し、オブジェクトを定義してみよう。
オブジェクトを定義し、プロパティにアクセスできることが確認できただろうか。しかし、これだけでは、まだオブジェクト指向という感覚からは程遠い。メソッドはどのように定義するのだろうか。そもそも、JavaScriptでオブジェクト指向ができると何が嬉しいのだろうか。次回以降、解説していこう。
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
【レポート】人気の無料/有料アプリを毎週紹介 - 1月31日~2月8日のAndroidアプリランキング [01:00 2/11] 携帯 |
|
渡部篤郎主演でドラマ化!地元新聞社が伝え続けた東日本大震災の物語 [00:08 2/11] キャリア |
|
沖縄発ヒーロー革命!「琉神マブヤー」が海を越えハワイを目指す! [00:08 2/11] キャリア |
|
中国四川省、パンダの保護と生態研究の最新情報とは? [00:08 2/11] キャリア |
|
日本の影響でオタク文化が発達!? 設楽統と杉崎美香がシンガポールのエンタメを探る! [00:07 2/11] キャリア |