Fonction JavaScript ordre: pourquoi est-il important?
Question Initiale:
JSHint se plaint quand mon JavaScript appelle une fonction qui est définie en bas de la page de l'appel à elle. Cependant, ma page n'est pas un jeu, et pas de fonctions sont appelées jusqu'à ce que toute chose a téléchargé. Pourquoi donc l'ordre de fonctions apparaissent dans mon code la matière?
EDIT: je crois avoir trouvé la réponse.
http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
Je suis en train de gémir à l'intérieur. Semble que j'ai besoin de passer un AUTRE jour de re-commande de six mille lignes de code. La courbe d'apprentissage avec le javascript n'est pas raide du tout, mais il est très loooooong.
- +1 pour l'excellente référence dans la mise à jour. Et j'espère que vous convainc que vous n'avez pas vraiment besoin de re-commander votre code. 🙂
Vous devez vous connecter pour publier un commentaire.
tl;dr Si vous n'êtes pas à l'appel de rien jusqu'à ce que tout se charge, vous devriez être bien.
Edit: Pour un aperçu de ce qui couvre aussi certains ES6 déclarations (
let
,const
): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_CheatsheetCette étrange comportement dépend
Voici quelques exemples.
C'est parce que de quelque chose qui s'appelle de levage!
Il y a deux façons de définir les fonctions: Fonction déclaration et de la fonction expression. La différence est ennuyeux, et de la minute, alors laissez-moi vous dire un peu de mal chose: Si vous avez écrit comme
function name() {}
, c'est un déclaration, et quand vous l'écrivez commevar name = function() {}
(ou une fonction anonyme attribué à un retour, des choses comme ça), c'est une fonction expression.Tout d'abord, examinons la manière dont les variables sont traitées:
Maintenant, comment la fonction déclarations sont traitées:
La
var
états "jette" le création defoo
vers le très haut, mais ne pas attribuer de la valeur à l'instant. La déclaration de la fonction est la prochaine étape en ligne, et, finalement, d'une valeur est affectée àfoo
.Et que dire de cela?
Seulement la déclaration de
foo
est déplacé vers le haut. La cession ne vient qu'après l'appel àbar
est faite, où il était avant le levage s'est produite.Et enfin, pour la concision:
Maintenant, qu'en fonction expressions?
Comme des variables, la première
foo
est déclaré au point le plus élevé de la portée, puis il est affecté d'une valeur.Nous allons voir pourquoi le deuxième exemple renvoie une erreur.
Comme nous l'avons vu auparavant, seule la création de
foo
est hissé, la tâche vient où il est apparu dans les "originaux" (onu-hissés) du code. Lorsquebar
est appelé, il est avantfoo
est affectée une valeur, doncfoo === undefined
. Maintenant, dans la fonction-corps debar
, c'est comme si vous êtes en train de faireundefined()
, ce qui déclenche une erreur.La principale raison en est probablement que JSLint ne fait qu'une seule passe sur le fichier afin qu'il ne vous connaît pas sera définir une telle fonction.
Si vous avez utilisé les fonctions syntaxe de l'instruction
Il n'y a effectivement pas de différence à tous où que vous déclarez la fonction (il se comporte toujours comme si la déclaration est au début).
D'autre part, si votre fonction a été définie comme un variable
Vous avez pour vous garantir l'habitude de l'appeler avant de l'initialisation (ce qui peut effectivement être une source de bugs).
Depuis la réorganisation des tonnes de code est complexe et peut être une source de bugs en lui-même, je vous suggère de rechercher une solution de contournement. Je suis sûr que vous pouvez dire JSLint le nom des variables globales à l'avance afin de ne pas se plaindre non déclarées choses.
Mis un commentaire sur le début du fichier
Ou vous pouvez utiliser une zone de texte là pour ça. (Je pense aussi que vous pouvez passer ce dans les arguments à l'intérieur jslint fonction si vous pouvez intervenir.)
Il y a trop de gens poussent arbitraire des règles sur la façon JavaScript doit être écrit. La plupart des règles sont de proférer des âneries.
Fonction de levage est une fonction en JavaScript parce que c'est une bonne idée.
Lorsque vous avez une fonction interne qui est souvent l'utilité de fonctionnement intérieur, de l'ajouter au début de la fonction externe est acceptable style de l'écriture de code, mais elle a l'inconvénient que vous avez à lire à travers les détails pour en arriver à ce que l'extérieur de la fonction n'.
Vous devez vous en tenir à un principe tout au long de votre base de code, soit mis en privé, les fonctions de premier ou en dernier dans votre module ou de la fonction. JSHint est bon pour faire respecter la cohérence, mais vous devez ABSOLUMENT régler l' .jshintrc en fonction de vos besoins, de ne PAS ajuster votre code source à d'autres peuples loufoque concepts de codage.
Un style de codage que vous pouvez voir dans la nature que vous devriez éviter, car il vous donne aucun avantage et seulement possible de refactoring de la douleur:
C'est exactement ce que la fonction de levage est là pour éviter. Juste à apprendre la langue et de valoriser ses atouts.
Seule déclaration de fonction sont hissés pas l'expression de fonction (affectation).