setTimeout ile sınıf metodlarını çalıştırma
javascript'in setTimeout fonksiyonu ile çalıştırılan kodlarda değişken tanım alanları kaybolmaktadır. Belirli bür süre geçtikten sonra bir nesnenin bir metodunu çağırmak istediğinizde nesneye erişilemediğinden metoda da erişemeyecek ve hata meydana gelecektir. Çok can sıkıcı ve fazladan birkaç satır daha yazılmasını neden olur.
Örnek:
html kodu:<p id="status"></p>
Javascript kodu: function person() {
this.fname='nobody';
} // sınıf tanımlandı
person.prototype.speak = function() {
$('#status').append('#hello, My name is ' + this.fname + ' I\'m speaking.<br>');
}
person.prototype.say = function() {
$('#status').append('#' + this.fname + ', eureka! Horay!<br>')
}
person.prototype.think = function() {
$('#status').append('#' + this.fname + '. think think think...<br>')
setTimeout(this.say, 2000);
}
var p1 = new person();
var p2 = new person();
p1.fname = 'mustafa';
p1.speak();
p2.fname = 'Ali';
p2.speak();
p1.think();
p2.think();
Bu kodda person sınıfından p1 ve p2 isimli iki nesne oluşturuluyor. Öncelikle speak() metodları çağrılıyor ve beklendiği gibi çalışıyorlar. Ardından think() metodlarını çağrılıyor ve bunlar da bekleneni yapıyorlar.
Fakat, bu think metodu son olarak, iki saniye sonra say() metodunun çağırılmasını belirtiyor.
Problem burada başlar. setTimeout metodu değişken tanım alanını beklenildiği gibi algılamayacaktır. "this" ifadesini global alanda arayacak ve beklenmeyen şekilde çalışacaktır.
Kod şöyle olsaydı sorun olmayacaktı: setTimeout(p1.say, 2000);
Fakat nesne isimlerini bilmek pek mümkün olmadığından, daha doğrusu böyle olması ileride işleri karıştıracağından bu yöntem doğru değildir.
Şöyle bir yöntem daha mantıklı olacaktır:person.prototype.think = function() {
$('#status').append('#' + this.fname + '. think think think...<br>');
var t=this;
var n = function() {
t.say()
};
setTimeout(n, 2000);
}
çalışan hali: http://jsfiddle.net/muatik/Cs4z9/3/
Bunun dışında başka yöntemler de vardır.


