2010-04-18 14 views
5

Si dans un objet littéral j'essaie de référencer une fonction en utilisant "this" dans une propriété/fonction imbriquée, cela ne fonctionne pas. Pourquoi? Une propriété imbriquée a-t-elle sa propre portée?Fonction imbriquée à l'intérieur de l'objet littéral

Par exemple, je veux appeler f1 à l'intérieur 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(); // Travail
objet.d.f2(); // Ne fonctionne pas. objet.e.f3(); // Travail

Merci, Andrea.

+4

À l'intérieur de f2, 'this' pointe vers' d', pas 'object'. – Matt

Répondre

9

this fait référence à d à l'intérieur de f2 et non object. Vous pouvez stocker une référence à l'objet, ou appelez object directement, ou utilisez call/apply pour appeler la fonction et de dire explicitement ce this signifie dans cette fonction:

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

Cette cela aussi travailler car il a une portée de fonction

var object = {  


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

Bonne idée, mais il contient quelques erreurs et ne fonctionnera pas dans sa forme actuelle. – WynandB

3

est ici une approche alternative qui ne change pas le contexte de l'intérieur thisf2(), basé sur @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 pour Module Pattern http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript –