2010-12-04 7 views
0

Je cette définition de TabList:JavaScript confusion portée

MyApp.TabList = function (selector) { 

    var private = { 
     $list: $(selector), 
     tabs: [] 
    }; 

    this.add = function (tab) { 
     private.tabs.push(tab); 
    }; 
}; 

Quand j'appelle cela, cependant, et de briser dans le corps de this.add, private ne figure pas dans le champ d'application locale:

MyApp.tabs = new MyApp.TabList("#tabs"); 

$("#tab-add").click(function() { 
    MyApp.tabs.add(new MyApp.Tab("title")); 
}); 

Est-ce que private ne reste pas à l'intérieur de l'objet?

Si ce code fonctionne de manière autonome comme ci-dessus, j'ai peut-être manqué quelque chose — J'ai essayé simplement de le faire de mon mieux à des fins démonstratives.

+0

@Agile Généralement, vous voulez mettre fin aux fonctions du constructeur avec 'return this;'. Je ne pense pas que cela fasse une différence, mais c'est une bonne pratique (d'après ce que j'ai entendu). –

+0

@Agile La variable 'private' n'est pas supposée être dans la portée locale de la fonction' add' - elle est dans sa portée externe (la portée de la fonction 'TabList' du constructeur). –

+2

@ Šime Vidas: hein? Pourquoi ferais-tu ça? Pourvu que vous utilisiez 'new', il n'est jamais nécessaire de le faire. Vous ne feriez cela que si vous le faites fonctionner sans le mot clé 'new'. –

Répondre

2

En raison de la propriété de fermeture , la variable doit définitivement être disponible dans la fonction add().

Ceci peut ne pas être la réponse, mais private est un mot clé Javascript. Vous devriez essayer d'éviter de l'utiliser comme nom pour une variable. Cela peut provoquer l'apparition de bogues inconnus, et parfois les débogueurs n'aideront pas. Essayez-le et faites-nous savoir si cela fonctionne!

+0

+1 Bonne capture :) –

+0

Changé "privé" pour souligner le caractère et le problème persiste. :( – AgileMeansDoAsLittleAsPossible

+0

@Agile Quel est exactement le problème? Une erreur est-elle générée? –