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
  );
})();