2010-04-18 14 views
5

se in un oggetto letterale provo a fare riferimento a una funzione utilizzando "this" all'interno di una proprietà/funzione nidificata, ciò non funziona. Perché? Una proprietà nidificata ha il proprio ambito di applicazione?Funzione annidata all'interno dell'oggetto letterale

Per esempio, voglio chiamare f1 da d.f2 all'interno:

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(); // Non lavorare. oggetto.e.f3(); // Work

Grazie, Andrea.

+4

All'interno di f2, 'questo' punta a' d', non 'oggetto'. – Matt

risposta

9

this fa riferimento a d all'interno di f2 e non object. È possibile memorizzare un riferimento all'oggetto, oppure chiamare object direttamente, o utilizzare call/apply per chiamare la funzione ed esplicitamente indicare cosa this significa all'interno di quella funzione:

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

Questa questo funziona anche perché ha portata funzione

var object = {  


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

Buona idea, ma contiene alcuni errori e non funzionerà nella sua forma attuale. – WynandB

3

Ecco un approccio alternativo che non cambia il contesto di this all'interno f2(), sulla base di @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 per il modello di modulo http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript –

Problemi correlati