2014年5月30日金曜日

jajavascriptを再学習の5【javascriptのthis】


javascriptのthisはよくわからないっすよねー。
なにかというと、
【callの第一引数に文字列Objectを設定可能】
なのですよね。

前回のサンプルによると、
  1. function foreacher(list,callback){  
  2.  for(var w=0;w<list.length;w++){  
  3.   callback.call(list[w],w);  
  4.  }  
  5. }  
  6. var waza=["背負投","払腰","袖釣込腰","内股すかし","出足払い"];  
  7. foreacher(waza,  
  8.  function(idx){  
  9.   assert(this == waza[idx],waza[idx]);  
  10.  }  
  11. );  
なんてことを書いてるわけですが。。
よくthisって何かって説明で、
【自分自身を表すObject】みたいに書いてあります。
まったくその通りなんですが、、、
サンプルを見てみると、、
waza[idx]は明らかに文字列です。
typeof(waza[idx]) は"string"です。
でも、this == waza[idx]はtrueです。
でも、this === waza[idx]はfalseです。
まぁここまではよしとしましょう。
しかしながら、以下はどうでしょう。
●その1
  1. var moji = {};  
  2. moji.abc = function(){alert("moji-abc");};  
  3. moji.abc();  
これを実行すると、alertが出ます。当然の結果です。でも、、、
●その2
  1. var moji = "moji";  
  2. moji.abc = function(){alert("moji-abc");};//1  
  3. moji.abc();//2  
これを実行すると、エラーです。
ためしに、typeof(moji.abc)を見ると、undefinedです。
でも、1ではエラーでにはなりません。
2がエラーになります。そんな関数しらないよと。
1のときに、【文字列Objectにプロパティをい追加できません】とか出してエラーになってくれるといいんですけどね。

このthisはサンプルのようには使えますが、だからといってその"waza[idx]"に、プロパティとか設定できません。
そう、なんの使い道があるのでしょう。
謎です。

0 件のコメント:

コメントを投稿