2010-11-30 4 views

Répondre

4

-vous un chèque typeof pour la fonction, par exemple:

if(typeof this["functionName"] != "undefined") { 
    alert("uh oh, doesn't exist"); 
} 

Si vous devez vérifier si elle existe et est une fonction pour être encore plus sûr:

if(typeof this["functionName"] == "function") { 
    this["functionName"](); //it exists, call it 
} 

Ou la version la plus détendue:

if(this["functionName"]) this["functionName"](); 

Si le nom ne change pas (par ex. Je mal interprété la question) il suffit d'utiliser la notation par points, comme ceci:

if(this.functionName) this.functionName(); 

Ou bien sûr, il ne doit pas être this ... quel que soit l'objet que vous vérifiez, utilisez que, si elle est une utilisation globale de la fonction window.

+1

que se passe-t-il si 'functionName' n'est pas une fonction? – jAndy

+0

@jAndy - Il veut une fonction à appeler qui peut ou peut ne pas être définie ... vous pouvez l'inverser bien sûr et vérifier le '.toString()' ou 'typeof' pour' function', mais je dirais que vous avoir un mauvais chevauchement de noms dans ces cas ... souvent vous voulez les deux, par exemple ce peut être une fonction ou un sélecteur, ou un bool, il y a plusieurs exemples de ceci à travers les frameworks :) –

+0

Je ne sais pas .. 'this ["functionName")() 'tomberait probablement comme désastreux s'il ne s'agit pas d'un objet fonction. – jAndy

1

dépend à peu près sur la portée que vous êtes.

Mais en général if('function_name_to_check' in this) reviendriez true s'il y a une propriété dans la portée globale ou locale qui a ce nom.

Cette vérification doit être suivie d'un test supplémentaire pour le type:

if(typeof this.function_name_to_check === 'function') { } 

pour être sûr que ce soit une fonction.

0

Si vous ne souhaitez que pour éviter les erreurs, vous pouvez tourner les tables:

try{function2call();} 
catch(e){alert('function2call() doesn\'t exist');} 
+0

C'est une mauvaise idée dans tous les cas, les blocs 'try/catch' ont de réels problèmes de performance, sans compter que lancer une exception est * way * plus cher que le' if' vérifie le type. –

+0

Alors, que voulez-vous dire pourquoi existe-t-il une construction comme try/catch, si elle est mauvaise dans tous les cas? Essayez 'alert ('alert est une fonction:' + (typeof alert == 'function'));' dans MSIE, cela retournera-t-il l'attendu? –

Questions connexes