2010-04-18 21 views
5

si en un objeto literal trato de hacer referencia a una función usando "this" dentro de una propiedad/función anidada, esto no funciona. ¿Por qué? ¿Una propiedad anidada tiene su propio alcance?Función anidada dentro del Objeto literal

Por ejemplo, i desea llamar f1 de d.f2 interior:

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(); // Trabajo
object.d.f2(); // No funciona. object.e.f3(); // Trabajo

Gracias, Andrea.

+4

Dentro de f2, 'this' apunta a' d', no 'object'. – Matt

Respuesta

9

this refiere a d dentro de f2 y no object. Se podría almacenar una referencia al objeto, o llame object directamente, o utilizar call/apply llamar a la función y explícitamente decirle qué this significa dentro de esa función:

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

Esta esto también va a trabajar porque tiene ámbito de la función

var object = {  


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

Buena idea, pero contiene algunos errores y no funcionará en su forma actual. – WynandB

3

Aquí es un enfoque alternativo que no cambia el contexto de this dentro f2(), basado en @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 para Patrón de módulo http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript –

Cuestiones relacionadas