タイトルが長ったらしいですが、実際に自分が詰まったので、このタイトルで書くことにしました。
例えば、Hoge
クラス内に、hoge
メソッド、hogehoge
メソッド、piyopiyo
メソッドを定義し、hoge
メソッドから3秒カウントダウンする間にhogehoge
メソッドを呼び出し、時間切れでpiyopiyo
メソッドを呼び出す場合を考えます。以下は正しく動作しないプログラムです。
function Hoge() {
var hoge = function() {
var sec = 3;
var countdown = function() {
if(sec-- > 0) {
this.hogehoge();
setTimeout(arguments.callee, 1000);
} else {
this.piyopiyo();
}
}
}
var hogehoge = function() {
console.log("hogehoge");
}
var piyopiyo = function() {
console.log("piyopiyo");
}
}
var h = new Hoge();
h.hoge();
コンソールを開いたFirefoxでこのコードを実行したところ、
TypeError: This.hogehoge is not a function
と出力されました。
解決方法
結論から書きますと、Hoge
クラス内のthis
を他の変数に保存し、必要に応じて呼び出せば実行出来ます。
例えば、上で述べた、正しくないコードを動作するように書き換えると、以下のようになります。(修正はHoge
クラスのみ)
function Hoge() {
// thisを変数selfに代入
var self = this;
var hoge = function() {
var sec = 3;
var countdown = function() {
if(sec-- > 0) {
// thisからselfに変更
self.hogehoge();
setTimeout(arguments.callee, 1000);
} else {
// thisからselfに変更
self.piyopiyo();
}
}
}
var hogehoge = function() {
console.log("hogehoge");
}
var piyopiyo = function() {
console.log("piyopiyo");
}
}
これでコンソールでは、hogehoge
メソッドが3回、1秒毎に実行された後、piyopiyo
メソッドが1回実行されます。 まだ、JavaScriptにおけるthis
の挙動を理解し切れていないので、ちょっとずつ勉強していけたらとは思っています。(まだちゃんとは理解していません...)
所感
JavaScriptでクラスのようなコードを記述しようとすると、Javaのようにクラスが定義出来ないので、ややこしく感じます。 正直、JavaScriptが余計に嫌いになりました...
自分の勉強不足もあって、内容がいまいちかもしれませんが、とりあえず書きたいことを書けたので、今回はここまで
参考文献