2014年6月19日木曜日

jajavascriptを再学習の6【無名関数】と再帰

ということで、無名関数いきましょう。
 window.onload = function(){
  assert(true,"onload!!!");
 };

 var ninja = {
  seoi:function seoinage(){ assert(true,"ninja 背負い投げ!"); },
  ohsoto:function (){ assert(true,"ninja 大外刈り!"); }
 };
 ninja.出足払い = function(){ assert(true,"ninja 出足払い!");  };
 ninja.出足払い();
 ninja.seoi();
 ninja.ohsoto();
 assert(true,ninja.seoi.name);
 assert(true,ninja.ohsoto.name);
 assert(true,"------------END------------");
まぁこんな感じなわけですが。。

6行目7行目はそれぞれninjaObjectのプロパティとして関数を設定していますが、
前者は名前付き、後者は無名関数です。
それは、nameプロパティを表示させた結果(4)(5)を見ればわかるとおりです。

ただし、この【seoinage】という名前の関数、nameプロパティとして参照する外の用途
があるのかといわれれば、、ほとんどない。
なぜなら、関数の中からしか、この名前は参照できないからだ。
よって、再帰的に使う時には、その用途がある程度の話である。
(-_-;)

あと、現実的に使うかどうか別にして、
9、10行目と(1)の表示を見ればわかるとおり、日本語もOKっすね。

ということで、無名関数のサンプルで、こんなノリのやつが本にはかかれていたわけですが、
 var ninja = {
  chop:function (n){
   return (n>1)? ninja.chop(n-1) + "-chop" : "chop";
  }
 };
 assert(true,ninja.chop(4));
しかし、、まぁよくないサンプルとしてはいいのですが、、
プログラム的には、あまりに美しくないわけです。
せっかく【ninja】というobjectを定義(生成?)しておきながら、
そのプロパティとしての関数の中で、また【ninja】を参照するという。。。
本では、色々な使い方の中でよくない理由を述べてるのはいいのですが、、
いや、これ、それ以前の問題!くらいの認識を持たないとダメだよね。。
で、結論としてはもちろん、
 var ninja = {
  chop:function chopper(n){
   return (n>1)? chopper(n-1) + "-chopper" : "chopper";
  }
 };
 assert(true,ninja.chop(4));
そう、こういう風に関数に名前をつけましょうという話でした。
もちろん、arguments.calleeという話題も無いわけじゃないが、それはそれで。(o^^o)



0 件のコメント:

コメントを投稿