ワシはワシなのだよ。
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]; for(var i=0;i<arr.length;i++) { console.log(arr[i]); }
上記の例、かなり無駄が多いですね。
どこが無駄なのかわかりますか?
また、どうすればベストなのかを考えてみてください。