2009-10-08 8 views
0

J'utilise javascript pour appeler des fonctions qui ont été mis dans un objet comme ceci:erreur Javascript: * est pas une fonction

generatewidgets['mywidget'] = function (mystring) { code } 

Plus tard, la boucle i à travers cet objet et appeler chaque fonction avec un paramètre de chaîne.

argument = 'abcdefg'; 
for (this.key in generatewidgets) 
    generatewidgets[this.key](argument); 

Cela fonctionne très bien dans IE8, mais dans Firefox lance une erreur "argument n'est pas une fonction". Il le fait avec n'importe quel nom de variable que je spécifie pour la chaîne. J'ai également essayé:

generatewidgets[this.key](argument+''); 

qui résulte en "'abcdefg' n'est pas une fonction". Quelqu'un sait ce que cette erreur signifie ou pourquoi je l'obtiens?

Répondre

1

Vous pouvez également vérifier le type avant l'appel:

for (var key in generatewidgets) { 
    if (typeof generatewidgets[key] === 'function') 
    generatewidgets[key](argument); 
} 

Ceci est probablement une bonne idée de toute façon dans le cas où quelque part sur la route que vous voulez jamais ajouter un non -fonction de l'élément à l'objet.

+0

Cela s'est avéré être la bonne solution, bien que la raison pour laquelle n'est pas clair de la poste ci-dessus, donc je vais spécifier plus. Je créais generatewidgets = new Array(); plutôt que generatewidgets = {}; La classe array crée un objet avec un tas de propriétés non-fonctions qui apparaissaient également dans la boucle. La solution correcte pour moi serait d'instancier l'objet correctement, bien que cette solution fonctionne probablement mieux dans le cas plus général. – Travis

0

Cela fonctionne dans Firefox 3.5 pour moi. Voici comment je l'ai testé:

>>> var generatewidgets = {}, argument = 'abcdefg'; 
>>> generatewidgets['mywidget'] = function(mystring) { console.log(mystring); } 
function() 
>>> for (this.key in generatewidgets) generatewidgets[this.key](argument); 
abcdefg 
0

L'énumération des propriétés d'un objet énumérera plus de toutes les propriétés de cet objet, y compris celles que vous n'avez pas définies vous-même. Cela peut être un problème avec certaines bibliothèques JS qui définissent des objets sur Object.prototype, car l'énumération des propriétés de votre objet inclura ces propriétés sur le prototype.

Personnellement, je pense que la façon dont l'énumération Object est conçue en JavaScript est cassée, mais il est un peu trop tard pour y remédier.

Questions connexes