【コラム】
前回の記事では、無名関数を関数リテラルに割り当てるという操作を紹介した。なぜ、このような記法により関数を定義するのだろうか。
まず、無名関数を採用するメリットには、「命名する必要の無い関数をシンプルに記述できる」「(複数ファイルの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:42 2/9] |
| 【レポート】ROBO-ONE委員会 - 第20回大会でのROBO-ONE Lightの開催を決定 [20:27 2/9] |
| 火星に海の存在を示す有力な証拠が発見される - ESAが発表 [18:48 2/9] |
| iOS向けSPDYライブラリが登場、普及はじまるSPDY [11:57 2/9] |
| GitHubのアクティブプロジェクト、もっとも多いのはMITライセンス [11:42 2/9] |
|
【連載】出社前に。日常生活ですぐに使える! 英語クイズ 第117回 「黒幕、陰で糸を引く人たち」ってなんて言う? [07:00 2/10] ライフ |
|
[長谷川博己]新人賞受賞で“ミタ”がキタ! 鈴木京香との熱愛は「ご想像にお任せ」 [06:00 2/10] エンタメ |
|
[AKB柏木由紀]「SDN48」ラストシングルMVにゲスト出演 メンバーの10年後の同窓会で再会 [05:00 2/10] ホビー |
|
大東駿介、改名後初の写真集発売--名前を変えたのは「自分の決意表明です」 [00:30 2/10] エンタメ |
|
悲しいけれど超ウマい!極貧芸能人が編み出した奇跡のアイデアレシピベストテン! [00:06 2/10] キャリア |