Question

J'ai un fichier JavaScript long qui passe JSLint sauf pour « utilisé avant qu'il ne soit défini » erreurs.

je déclarations de fonctions normales, comme dans ...

function whatever() {do something;}

par opposition à ...

var whatever = function(){do something;};

et compatible avec réponse de Steve Harrison à une version antérieure après ...

  

En supposant que vous déclarez tous vos   fonctions avec le mot-clé de la fonction, je   pense qu'il devient un style de programmation   question. Personnellement, je préfère   structurer mes fonctions d'une manière   semble logique et rend le code comme   lisible que possible. Par exemple,   comme vous, je mettrais une fonction init à   le haut, parce que c'est où tout   commence à partir.

... J'aime voir les fonctions dans un ordre qui fait sens pour moi.

Les fonctions de script parfaitement dans les différents navigateurs testés (par exemple, FireFox, Safari, Safari Mobile, Fennec, IE, Chrome, Midori, etc.).

Voici le problème: je veux utiliser le script à l'intérieur d'une application iPhone en cours de construction avec du titane, mais son compilateur arrête avec des erreurs « utilisées avant définies ».

Comment puis-je contourner cela?

Cela peut être une question stupide, mais aussi ... Si les fonctions doivent être appelés dans un ordre particulier, comment peut-on résoudre le problème d'une fonction appelée besoin de rappeler à la fonction qui a appelé à l'origine il? Par exemple ...

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

Si les fonctions doivent être déclarées dans l'ordre, function screen1 devrait précéder function buildMenu. Mais si, dans certaines conditions, screen1 ne peut pas être construit et veut donc réafficher le menu (à savoir, appeler une fonction qui est techniquement pas encore déclarée)?

Ah oui ... une question: des sites ou des programmes là-bas que re-séquence automatiquement les fonctions plutôt que d'exiger le programmeur de le faire manuellement

Était-ce utile?

La solution

Non, la réponse de l'EM est pas la bonne solution. Essayez d'exécuter cette JavaScript:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

En effet, l'interprète d'abord lire la déclaration de fonction, créez le nom foo en fonction qui imprime « droit », lit alors l'instruction var, et trouve qu'il ya déjà un foo nom il sautera la création d'une nouvelle variable avec la valeur undefined, comme cela se produit normalement. Ensuite, il traite le code, ligne par ligne, qui comprend une affectation à foo. La déclaration de fonction ne soit pas retraitée. Peut-être cela va se comporter différemment en titane, mais essayez ceci dans Firebug et vous obtiendrez ce que je suis.

Une meilleure solution est:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

passera également JSLint et produire le comportement correct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top