お寿司か焼き肉食べたい

まじめな事からしょーもない事まで
めにゅーを開く(投げやり)

ワシはワシなのだよ。

thisです。
よく使う便利な子なのですが、しれっと変わってしまう時があります。
慣れてない方は若干悩むかもしれませんね。

thisとはなんぞや

簡単に言うと、【自分自身】、ってやつです。
自分自身ですよ。

使用例

こいつを実行してみましょう。

window.onload = function(){
 var myObj = function()
 {
  this.name = '太郎';
  this.init = function ()
   {
    this.hello();
   }
  this.hello = function ()
  {
   alert('こんぬつあ'+this.name);
  }
 }

 var objIns = new myObj();
 objIns.init();
}

今回の【this】は、myObjオブジェクトのことを指します。
なので、nameのデータが取得できているわけなのです。
各メソッドもthisをつけて、自分自身(myObj)のメソッド、という意味合いとなります。
では以下はどうでしょう。

こいつを実行してみましょう。
ボタンタグもこの通りにしてくださいね。(ゲス顔)

<input type="button" name="バカ" value=" クリックする " id="elem1" >
window.onload = function(){
 var myObj = function()
 {
  this.name = '太郎';
  this.init = function ()
   {
    var button = document.getElementById("elem1");
    // ボタンのイベントハンドラに、メソッドhelloをセット
    button.onclick = this.hello;
   }
  this.hello = function ()
  {
   alert('こんぬつあ'+this.name);
  }
 }

 var objIns = new myObj();
 objIns.init();
}

実行結果どうでしたか?太郎とでるはずなのに、意味不明に煽られたと思います。
thisがコロコロ変わるのはまさにこのことなのです。
では、thisの矛先が変わったタイミングを以下に

button.onclick = this.hello; // ここ!!!

ここで、イベントが発生します。
ここからオブジェクトではなく、【取得要素のイベント】に変わります。
なので、thisはオブジェクトから要素(ここで言えば、buttonタグ もっと言えばdocument.getElementById("elem1")これ)
で、helloメソッドで、this.nameとなっていますので、ボタンタグのname属性が呼び出されます。

これは困りました。

このthisは欠陥だ。使えないよう
なのです。このまま使えば必ずこうなってしまうのです。
ではどうすればいいのか?予めthisを保護してやればよいのです。

<input type="button" name="バカ" value=" クリックする " id="elem1" >
window.onload = function(){
 var self = "";
 var myObj = function()
 {
  this.name = '太郎';
  this.init = function ()
   {
    var button = document.getElementById("elem2");
    // ボタンのイベントハンドラに、メソッドhelloをセット
    self = this; // myObjのthisを保管する。
    button.onclick = this.hello;
   }
  this.hello = function ()
  {
   alert('こんぬつあ'+self.name);
  }
 }

 var objIns = new myObj();
 objIns.init();
}

と言うわけでどうでしょう。期待通りの動きをしてくれたのではないでしょうか。
今回はオブジェクトなので、若干ピンとこないと思います。
よく使いそうな例でもおいておきますね。

<a href="javascript:void(0);" id="elem3">さぁクリックするのだ!</a>
window.onload = function(){
 document.getElementById('elem3').onclick = function()
 {
  this.style.color = '#FF0000';
  var self = this;
  setTimeout(function()
  {
   // ダメな例
   //this.style.color = '#000';
   self.style.color = '#000';
  },1000);
 }
}

thisは便利ですが、少し目を離すと動かないとかいったトラブルもあります。
動かない時は落ち着いて、alertを順番にしていってデバッグをしていきましょう。

待ちなさい

わざわざthisを使う必要なくね?
と思われても仕方がないですね。特に↑の例なんか。
self.style.color = '#000';

document.getElementById('elem3').style.color = '#000';
にすればthisなんかいらんかったんや!!!!

確かに動作はするでしょう。だがしかし
document.getElementById('elem3')とすることで、またDOMの中に探しに行っているのです
こんな無駄な話はありません。

ついでのお話

さて、少しついでのお話になりますが、ついでの癖に重要なお話であったりします。
今回は変数に入れることの大切さ、です。

document.getElementById('elem5').style.color = '#000';
document.getElementById('elem5').onclick = function()
{
 console.log('クリックされたンゴ');
}
document.getElementById('elem5').onmouseover = function()
{
 console.log('マウスオーバーしたンゴ');
}
document.getElementById('elem5').onmouseout = function()
{
 console.log('マウスどっかいったンゴ');
}

var arr = [1,2,3,4,5,6,7,8,9,10];
console.log(arr.length);
for(var i=0;i<arr.length;i++)
{
 console.log(arr[i]);
}

上記の例、かなり無駄が多いですね。
どこが無駄なのかわかりますか?
また、どうすればベストなのかを考えてみてください。