2014年6月19日木曜日

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

ということで、無名関数いきましょう。
  1. window.onload = function(){  
  2.  assert(true,"onload!!!");  
  3. };  
  4.   
  5. var ninja = {  
  6.  seoi:function seoinage(){ assert(true,"ninja 背負い投げ!"); },  
  7.  ohsoto:function (){ assert(true,"ninja 大外刈り!"); }  
  8. };  
  9. ninja.出足払い = function(){ assert(true,"ninja 出足払い!");  };  
  10. ninja.出足払い();  
  11. ninja.seoi();  
  12. ninja.ohsoto();  
  13. assert(true,ninja.seoi.name);  
  14. assert(true,ninja.ohsoto.name);  
  15. assert(true,"------------END------------");  
まぁこんな感じなわけですが。。

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

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

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

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



0 件のコメント:

コメントを投稿