51 votes

Un var par fonction en JavaScript?

J'ai été en utilisant JSLint pour me faire sentir mal à propos de mon JavaScript. Il est grand, par la manière. Il y a une case que je n'ai pas tout à fait comprendre et j'aimerais votre point de vue, s'il vous plaît.

À partir de jslint.com:

Dans les langues avec le bloc de portée, il est généralement recommandé que les variables déclarées sur le site de la première utilisation. Mais parce que le JavaScript n'a pas de bloc de portée, il est plus sage de déclarer la totalité d'une fonction de variables dans le haut de la fonction. Il est recommandé qu'une seule instruction var être utilisé par la fonction.

Quelle est la dernière sentance en gras vraiment en train de dire? Je pense que je devrais être de déclarer plusieurs variables comme ceci?

var foo = 1, bar = 2;

Et, est le "sage" de la partie juste un style de programmation pour décourager les erreurs en bas de la ligne ou est-il plus que cela?

Merci pour votre aide.

72voto

Breton Points 9625

Le problème est que, que vous en soyez conscients ou non, de javascript, de manière invisible, se déplace tout le var déclarations au-dessus de la portée de la fonction.

donc, si vous avez une fonction comme ceci

var i = 5;
function testvar () {
     alert(i);
     var i=3;
}
testvar();

la fenêtre d'alerte contiendra pas défini. car en interne, il a été changé en cela:

var i = 5;
function testvar () {
     var i;
     alert(i);
     i=3;
}
testvar();

ceci est appelé le "levage". La raison crockford donc, plaide fortement en faveur de la var déclarations aller au sommet, c'est qu'il rend le code visiblement correspondre à ce qu'il va faire, au lieu de laisser l'invisible et le comportement inattendu de se produire.

8voto

CMS Points 315406

L'essentiel dans les blocs JavaScript ({ ... }) à ne pas introduire un nouveau champ d'application, il y a seulement la fonction de la portée, donc pas de champ est créé sur une autre instruction.

Une variable introduite dans une fonction est visible partout dans la fonction.

Par exemple:

function myFunction(){
  var one = 1;

  if (one){
    var two = one + 1;
  }

  (function () {
    var three = one + two;
  })();

  // at this point both variables *one* and *two* are accessible but 
  // the variable *three* was declared in the scope of a inner function
  // and is not accessible  at this point.
}

Dans les langues avec le bloc de portée, il a recommandé de déclarer les variables au moment de la première utilisation, mais depuis que JavaScript n'a pas de bloc de portée, il est préférable de déclarer la totalité d'une fonction de variables dans le haut de la fonction.

Cochez cette article.

6voto

Triptych Points 70247

L'absence de bloc de portée explique le code ci-dessous:

var a = 1;
if (something) {
    var a = 2;
}

alert(a); // Alerts "2"

Dans la plupart des C-style (comme dans la syntaxe) langues, l' var a = 2 définition serait de définir " une " uniquement pour le champ d'application de l' if bloc. À l'aide d'une seule instruction var en haut de la fonction permet d'éviter ce caprice de Javascript, ce qui n'est pas toujours aussi évidente que ci-dessus, et serait inattendu pour C/C#/Java programmeurs.

4voto

Chetan Sastry Points 14742

Oui, cela signifie que vous déclarer toutes les variables au début de la fonction. Si vous voulez le faire en une seule ligne ou sur plusieurs lignes est une question de choix.

La raison est expliquée dans le paragraphe que vous avez mentionné. Javascript variables, la fonction d'étendue. Si vous déclarez la même variable à l'intérieur d'un if/while/pour le bloc, elle sera remplacée par la nouvelle valeur, étant donné que le bloc n'a pas d'effectuer un nouveau champ d'application. Ceci est différent de langues comme Java. Pour éviter de telles surprises, de déclarer toutes les variables que vous allez utiliser dans la fonction au début de la fonction, de sorte que vous n'avez pas accidentellement "redeclare' andything.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X