2010-04-18 10 views
5

jeśli w obiekcie dosłownym próbuję odwołać się do funkcji za pomocą "this" wewnątrz zagnieżdżonej właściwości/funkcji, to nie działa. Czemu? Zagnieżdżona własność ma swój zasięg?Funkcja zagnieżdżona wewnątrz obiektu literalnego Obiekt

Na przykład, chcę zadzwonić f1 od wewnątrz d.f2:

var object = {  

    a: "Var a", 
    b: "Var b", 
    c: "Var c", 

    f1: function() { 
    alert("This is f1"); 
    }, 

    d: { 
     f2: function() { 
     this.f1(); 
    } 
    }, 

    e: { 
     f3: function() { 
     alert("This is f3"); 
    } 
    } 
} 

object.f1(); // Work
object.d.f2(); // Nie działa. object.e.f3(); // Praca

Dzięki, Andrea.

+4

Wewnątrz f2, 'this' wskazuje na' d', a nie 'object'. – Matt

Odpowiedz

9

odnosi się do d wewnątrz f2, a nie object. Można przechowywać odwołanie do obiektu lub zadzwoń object bezpośrednio lub użyj call/apply aby wywołać funkcję i wyraźnie powiedzieć to co this oznacza wewnątrz tej funkcji:

object.d.f2.call(object); // now this refers to object inside f2 
0

ten będzie również działać, ponieważ ma zakres funkcji

var object = {  


    d: { 
     myThis = this; 
     f2: function() { 
     myThis .f1(); 
     } 
    }, 
    } 
+0

Dobry pomysł, ale zawiera kilka błędów i nie będzie działał w obecnej formie. – WynandB

3

Oto alternatywne podejście, które nie zmienia kontekst this wewnątrz f2(), w oparciu o @slaver113's idea:

 
var object = (function() { 
    var _this = { 
    f1: function() { 
     alert('This is f1'); 
    }, 
    d: { 
     f2: function() { 
     _this.f1(); 
     } 
    } 
    } 

    return _this; 
})(); 

object.d.f2(); // Alerts 'This is f1' 
+2

+1 dla wzorca modułu http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript –