2010-05-07 3 views
0

Au début du fichier javascript, j'ai:Associative Array/objet ne peut pas être lu dans les fonctions

var lbp = {}; 
lbp.defaults = { 
    minLength: 40 
}; 

je peux alerter avec succès par la suite, avec:

alert(lbp.defaults.minLength); 

Mais dès que je le mets dans une fonction, quand je alerte, je reçois "Undefined". Qu'est-ce qui donne, et comment puis-je éviter cela? Est-il absolument nécessaire de passer cette variable dans chaque fonction, par exemple, en faisant:

function(lbp) { alert(lbp.defaults.minLength); } 

j'aurais pensé que définir d'abord, il atteindrait une portée globale et ne pas être nécessaire pour être adoptée en?

Merci à l'avance pour moi :) éclairer

================================== ==

EDIT: Le problème semble être que ma fonction d'initialisation est elle-même définie dans lbp. Y at-il un moyen d'utiliser cette fonction var, et encore utiliser lbp vars à l'intérieur?

lbp.initialize = function() { 
     alert(lbp.defaults.minLength); 
}; 

Le bit de code complet ressemble à ceci:

<script type="text/javascript"> 

var lbp = { 
    defaults: { 
     minLength: 40 
    } 
}; 

lbp.initialize = function() { 
    alert(lbp.defaults.minLength); 
}; 
    window.onload = lbp.initialize; 
</script> 
+0

Comment appelez-vous cette fonction?, Passez-vous l'objet comme argument? – CMS

+0

J'ai ajouté le code de script complet au-dessus de – Matrym

+0

Je vais aussi ajouter, en changeant lbp.initialize juste initialiser dans les deux instances résout le problème. C'est la solution simple. Je me demande s'il y en a une autre - mais je suppose qu'il n'y en a pas. – Matrym

Répondre

2

Utilisez this.

var lbp = { 
    defaults: { 
     minLength: 40 
    } 
}; 

lbp.initialize = function() { 
    alert(this.defaults.minLength); 
}; 

window.onload = function() { lbp.initialize(); }; 

Si vous appelez initialize comme méthode de lbp, this pointera vers lbp. Lorsque vous affectez une fonction à un gestionnaire d'événements, tel que window.onload, vous copiez essentiellement le corps de cette fonction dans l'objet sur lequel le gestionnaire d'événements est défini. Ainsi,

window.onload = lbp.initialize 

est le même que

window.onload = function() { 
    alert(this.defaults.minLength); 
}; 

Maintenant, this pointe vers window, ce qui est évidemment pas ce que nous voulons. En enveloppant l'appel à lbp.initialize() dans une fonction, nous conservons le contexte de this dans cette fonction et nous pouvons nous assurer qu'il pointe toujours vers lbp. Découvrez this pour une explication plus complète.

+0

Encore undefined. Merci quand même. – Matrym

+0

Ah, vous avez posté votre code complet. Voir ma modification. –

+0

Vraiment? si vous ajoutez: *** window.onload = lbp.initialize; *** au bas de votre code, vous n'obtenez pas d'erreur? – Matrym

1

Cela fonctionne pour moi de javascript console dans Firefox:

javascript:var lbp={}; lbp.defaults={minLength: 40};function xx() { alert(lbp);alert(lbp.defaults);alert(lbp.defaults.minLength); }; xx(); 

donne une sortie [objet objet], [objet objet ], 40.

Donc, il semble qu'il pourrait y avoir un problème avec un code associé, qui n'est pas sho wn?

+0

Bon point gnudiff. J'ai ajouté une modification à ma question - car vous m'avez aidé à mieux définir le problème. – Matrym

3

Passez-vous réellement lbp comme argument? Sinon, le paramètre portant le même nom masquera la variable globale.

+0

Je ne passe rien avec function(). Vous pouvez voir mon code complet dans mon message ci-dessus. Si je devais ajouter la fonction (lbp), comment suggéreriez-vous que je me réfère à cela? "ceci" n'a pas fonctionné ... – Matrym

0

Dans le code d'origine où vous essayez d'utiliser lbp dans une fonction. Vous passez lbp en argument.Cela cacherait le lbp de la portée globale avec une variable locale (à la fonction) du même nom (sauf si vous appelez la fonction à laquelle vous avez passé lbp).

//this is what you have and will not alert a thing other 
//and will probably throw an error 
function(lbp) { alert(lbp.defaults.minLength; } 
//should just be this with no argument. this will allow 
//the function to see lbp in the global scope. 
function() { alert(lbp.defaults.minLength; } 

en passant LBP comme paramètre dans la première fonction, il ne se voit pas dans la fonction que l'objet global, mais l'argument local.

Questions connexes