Kerülő megoldások
Néhány kerülő megoldás létezik. Az egyik leggyakrabban alkalmazott megoldás a lezárást használja ki.
init : function(){
var oBtn = document.getElementById('btnTest');
// tetszőleges változóba elmentjük a this objektumreferencia értékét
var self = this;
oBtn.onclick = function(){
// a belső függvény hivatkozhat a külső függvény változóira
alert(self.locales.message);
};
oBtn = null;
}
Szintén gyakori megoldás ún. „expando property” használata. A HTML nyomógombot egy új tulajdonsággal bővítjük, amelyben objektum referenciát tárolunk az objektumunkra.
var App = {
locales : {
message : "button clicked"
},
init : function(){
var oBtn = document.getElementById('btnTest');
oBtn._obj = this;
oBtn.onclick = function(){
var self = this._obj;
alert(self.locales.message);
};
oBtn = null;
}
};
window.onload = App.init;
Használhatjuk még a Function objektum call() és apply() metódusait is, ezek lehetővé teszik egy tetszőleges létező függvény meghívását a this kulcsszó beállításának lehetőségével. Íme egy példa:
MessageBox.prototype._FadeOut = function(opacity){
opacity = opacity || 85;
....
function callFadeOut(_this, _opacity){//return anonymous function
return (function (){
_this._FadeOut.call(_this,_opacity);
});
}
var fncRef = callFadeOut(this, opacity);
this.fadeTimeoutID = setTimeout(fncRef, 1000);
};
A setTimeOut() függvény egy JavaScript programrészlet vagy függvény időzített végrehajtására szolgál. A fenti példában a _FadeOut metódus végrehajtását időzítjük egy másodperccel későbbre. A setTimeout-ról tudni kell, hogy a lefuttatandó visszahívott függvény (angolul call back function) végrehajtási kontextusa (scope), azaz a this kulcsszó a globális window objektumra fog referenciát tartalmazni a függvény lefutásakor. A setTimeout() hiányossága, hogy a lefuttatandó függvénynek nem lehet paramétereket átadni.
A fenti példakód mindkét problémára megoldással szolgál, amelyhez lezárást alkalmaz. Létrehoztunk egy callFadeOut() kisegítő függvényt, ami gyakorlatilag létrehoz, és visszaad egy lefuttatandó függvényt. Ez a belső név nélküli függvény végrehajtja a visszahívást a megfelelő végrehajtási kontextus beállításával és a paraméterek átadásával.
A legtöbb JavaScript függvénykönyvtár megkímél minket az ilyen kerülő megoldások alkalmazásától, mivel tömör és elegáns megoldással szolgálnak a végrehajtási kontextus beállítására. Lássunk egy példát arra, hogyan rövidülne le a fenti kód, ha a népszerű Prototype JavaScript függvénykönyvtárat használnánk (◙{CDmelléklet}/peldakodok/hatokor elvesztese/setTimeot-pelda.htm).
MessageBox.prototype._FadeOut = function(opacity){
opacity = opacity || 85;
....
this.fadeTimeoutID=setTimeout(
this._FadeOut.bind(this,['param1']),
1000
);
})();