JavaScriptの技法:高度な関数の活用

JavaScriptの技法:高度な関数の活用
http://builder.japan.zdnet.com/news/story/0,3800079086,20364532,00.htm


「今風のJavaScriptは、何だか良く分からないなぁ」なんて思っていたら、
いい記事を見つけることができた。軽くまとめながら理解を深めてみる。

JavaScriptで関数を定義する方法

3種類の方法で関数を定義できる。

  • function文を用いた定義
    • function add(x,y) { return x + y;}
  • Function()コンストラクタを用いた定義
    • var add = new Function('x','y','return x + y;');
  • functionリテラルによる定義
    • var add = function(x,y) {return x + y;};

JavaScriptの関数は文字列でもある。


※出羽注:
JavaScriptの関数は文字列でもある。』を検証してみる。

var add = function(x, y) {
  return x + y;
}

alert(add(1,2));
alert(add);

なるほど。1回目のalertは 3 を表示するが、
2回目のalertは次のような関数そのものが表示されました。

function(x, y) {
 return x + y;
}

Function()コンストラクタを用いた関数定義のメリット

Function()コンストラクタを利用するメリットは、thisキーワードの使用が可能になること。


thisキーワードは、関数を呼び出したオブジェクトの参照として振る舞う。
thisを用いると、関数に呼び出し元のオブジェクトを渡すことが可能になる。


※出羽注:
うーん、自分にとってはとても斬新です。
Javaで考えるとメソッド呼び出し側が、こっそりとthisポインタを渡すようなイメージですね。
関数の呼び出し元のオブジェクトによって、処理を分岐させることか出来そうです。

クラスのコンストラクタとしてのJavaScript関数

JavaScriptの関数は、カスタムオブジェクトを作成する際に
クラスのコンストラクタとして実行させることが可能である。


クラスのコンストラクタ内でthisキーワードを使用することにより、
クラスのインスタンスでメソッドやプロパティを持てる。


※出羽注:
なるほど。この説明で、なぜJavaScriptでclassというキーワードを使わずに、
関数をクラスっぽく使うことができるのかの理由が理解できました。

可変長引数の関数

argumentsオブジェクトを利用すれば、関数で可変長の引数を扱えるようになる。


例として、以下のalert関数の結果は 10 である。

function add(x,y) {
       var fltResult = 0;

       for(var i=0;i < arguments.length;i++)
              fltResult += arguments[i];

       return fltResult;
}

alert(add(2,2,2,2,2));


また、argumentsオブジェクトは以下のプロパティを保持している

 calleeプロパティ : 現在のJavaScript関数への参照
 callerプロパティ : 現在の関数を呼び出した関数への参照


※出羽注:
無名関数で再帰をする場合は、arguments.callee は重宝しそうだ。

関数の引数における「値渡し」と「参照渡し」

 参照渡し : new演算子によって定義されたオブジェクト
 値渡し : 上記以外


※出羽注:
うーん、これについては、著者の人が間違っている気がする。
正しくは常に「値渡し」ではないだろうか?
「new演算子によって定義されたオブジェクト」の参照がコピーされたものが渡されるので、
一見すると参照渡しに見えるが実際には値渡しだと思う。
(実際のところはどうなんだろう?)