2010-04-16 3 views
1

myfunc() s'exécute correctement lorsqu'il est appelé depuis le même fichier js. mais il est indéfini (Firebug) lorsqu'il est appelé à partir d'une page HTML:La fonction JavaScript dans le fichier externe est indéfinie lorsqu'elle est déclarée d'une certaine manière

fichier JS:

$(function() { 
    myfunc() { 
     alert('inside myfunc'); 
    } 
    alert('outside myfunc'); 
    myfunc(); //this successfully runs myfunc() 
}); 

HTML:

<script> 
$(function() { 
    myfunc(); //this doesn't run myfunc(). It's undefined 
}); 
</script> 

Mais quand je change de déclaration myfunc() à:

myfunc = function() { ... } 

Il n'est plus indéfini et fonctionne correctement.

Désolé pour cette question très noob, mais qu'est-ce qui vient de se passer? Pourquoi cela a-t-il fonctionné quand j'ai changé la façon dont j'ai déclaré la fonction?

Répondre

9

C'est une question de portée.

Dans

$(function() { 
    myfunc() { 
     alert('inside myfunc'); 
    } 
    alert('outside myfunc'); 
    myfunc(); //this successfully runs myfunc() 
}); 

il est uniquement disponible dans la fonction anonyme (function() { }), donc il serait également disponible si vous deviez appeler en dehors de la fonction anonyme, mais dans le même fichier js.

Alors que si vous déclarez à l'aide

myfunc = function() { ... } 

myfunc est une variable globale et la fonction est disponible partout.

+0

Il convient de noter que l'enveloppe de fonction anonyme 'function() {...}' est utilisée principalement à cette fin! Si vous voulez définir une fonction globalement, laissez-la en dehors de l'encapsuleur. Si vous devez écrire une variable globale dans une portée locale, il est bon (et requis en ECMA262-5 Strict Mode) de déclarer 'var myvar;' dans la portée globale, en dehors du wrapper. – bobince

3

Dans le premier extrait, myfunc n'existe que dans portée de la fonction anonyme que vous avez définie. Dans le deuxième extrait, myfunc ne se trouve dans aucune portée visible. Enfin, dans le troisième extrait lorsque vous définissez myfunc au niveau supérieur, il est disponible à l'échelle globale afin que toute autre partie de votre javascript puisse l'appeler avec succès.

Si vous avez encore des difficultés à comprendre la portée variable dans Javascript, vous pouvez essayer de lire quelques-unes des the results for "javascript scope" on Google pour une explication plus complète.

Questions connexes