375 votes

L'utilisation de "var" pour déclarer des variables est-elle facultative ?

Le mot "var" est-il facultatif ?

myObj = 1;

comme ?

var myObj = 1;

J'ai constaté qu'ils fonctionnent tous les deux à partir de mon test, je suppose que var est facultatif. C'est bien ça ?

28 votes

"Facultatif" est peut-être un choix malheureux de mots, car var est facultatif dans le sens où une instruction d'affectation peut être interprétée avec ou sans lui, mais n'est pas facultatif dans le cas où vous voulez déclarer explicitement une variable en portée locale.

6 votes

Regardez ce violon : jsfiddle.net/GWr6Z/2

1 votes

Une autre différence que personne n'a mentionnée : console.out(var myObj=1) ne fonctionne pas, mais console.out(myObj=1) sorties 1. voir ma réponse (actuellement tout en bas)

595voto

Stefano Borini Points 36904

Ils ont des significations différentes. Si vous utilisez var la variable est déclarée dans la portée dans laquelle vous vous trouvez (par exemple, de la fonction). Si vous n'utilisez pas var la variable remonte les couches de la portée jusqu'à ce qu'elle rencontre une variable du nom donné ou l'objet global (la fenêtre, si vous le faites dans le navigateur), où elle s'attache alors. Elle est alors très similaire à une variable globale. Cependant, il peut toujours être supprimé avec delete (très probablement par le code de quelqu'un d'autre qui n'a pas non plus utilisé la fonction var ). Si vous utilisez var dans la portée globale, la variable est véritablement mondial et ne peut être supprimé.

C'est, à mon avis, l'un des problèmes les plus dangereux de javascript, et devrait être déprécié, ou au moins susciter des avertissements sur les avertissements. La raison en est qu'il est facile d'oublier var et ont par accident un nom de variable commun lié à l'objet global. Cela produit un comportement bizarre et difficile à déboguer.

0 votes

Vous pouvez créer une variable à l'intérieur d'une méthode sans utiliser la fonction var . Cela ne veut pas dire que c'est mondial, IE le fait souvent, comment cela peut-il être dangereux ?

0 votes

Le Gentleman d'élite : Faux. C'est le cas.

1 votes

@Le Gentleman d'élite : Oui, cela en fait une variable globale.

143voto

deceze Points 200115

C'est l'une des parties les plus délicates de Javascript, mais aussi l'une de ses caractéristiques essentielles. Une variable déclarée avec var "commence sa vie" là où vous le déclarez. Si vous omettez le var c'est comme si vous parliez d'une variable que vous avez déjà utilisée auparavant.

var foo = 'first time use';
foo = 'second time use';

En ce qui concerne le champ d'application, il est no vrai que les variables deviennent automatiquement globales. Au contraire, Javascript va remonter la chaîne de portée pour voir si vous avez déjà utilisé la variable auparavant. S'il trouve une instance d'une variable du même nom utilisée auparavant, il l'utilisera ainsi que la portée dans laquelle elle a été déclarée. S'il ne trouve aucune instance de la variable, il finira par utiliser l'objet global ( window dans un navigateur) et y attachera la variable.

var foo = "I'm global";
var bar = "So am I";

function () {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function () {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

Ce comportement est vraiment puissant lorsqu'il est utilisé avec des fonctions imbriquées et des callbacks. Apprendre ce que functions sont et comment la portée fonctionne est la chose la plus importante en Javascript.

17 votes

C'est vraiment la meilleure réponse, car connaître le comportement réel de la chaîne de portée est essentiel pour comprendre le fonctionnement du Javascript fonctionnel. Même si vous ne préférez pas coder dans un style fonctionnel, il est très utile de le savoir, compte tenu du nombre de bibliothèques couramment utilisées. hacer utiliser un style fonctionnel.

0 votes

N'est-ce pas ? var foo = 1 a été déplacé au sommet de la portée de la fonction actuelle, et non pas à l'endroit où vous le déclarez ? foo = 100; bar = 200; (function fooBarDeluxeEdition() { bar = 300; //var bar = 400; // try uncommenting this for fun! :) }()); document.write(bar);

1 votes

@carl La déclaration elle-même n'est pas déplacée vers le haut, non. Essentiellement, un var réserve le nom de la variable à l'intérieur de la portée actuelle, et elle commencera par un caractère undefined valeur. L'affectation de la valeur initiale ne se produira qu'à l'endroit exact où vous avez écrit var .. = .. .

82voto

Eineki Points 8632

Non, ils ne sont pas équivalents.

Avec myObj = 1; vous utilisez une variable globale.

Cette dernière déclaration crée une variable locale à la portée que vous utilisez.

Essayez le code suivant pour comprendre les différences :

external = 5;
function firsttry() {
  var external = 6;
  alert("first Try: " + external);
}

function secondtry() {
  external = 7;
  alert("second Try: " + external);
}

alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7

La deuxième fonction modifie la valeur de la variable globale "external", mais pas la première.

7 votes

Faites attention en disant "vous utilisez une variable globale". "monObj = 1 ;" fait référence à une variable dans une portée externe, qui peut ne pas être globale. Votre exemple, cependant, fait référence (et déclare potentiellement implicitement) une variable dans la portée globale.

23voto

bcherry Points 3541

Il y a un peu plus qu'une simple opposition entre local et global. Les variables globales créées avec var sont différentes de celles créées sans. Considérez ceci :

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

D'après les réponses données jusqu'à présent, ces variables globales, foo , bar y baz sont toutes équivalentes. Ceci est no l'affaire. Les variables globales réalisées avec var sont (correctement) affectés à l'interne [[DontDelete]] de sorte qu'ils ne puissent pas être supprimés.

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

C'est pourquoi vous devriez toujours utiliser var même pour les variables globales.

0 votes

Je pense que votre perspicacité mérite plus d'exposition, j'ai donc édité la réponse choisie pour inclure cette information.

16voto

kzh Points 5098

var est facultatif. var met une variable en portée locale. Si une variable est définie sans var il s'agit d'une portée globale et non supprimable .

modifier

Je pensais que la partie non supprimable était vraie à un moment donné dans un certain environnement. Je dois l'avoir rêvé.

3 votes

Court, mais pas correct. Si elle est "définie" comme vous le dites sans var, vous peut la supprimer. Mais ne pas utiliser var ne signifie pas toujours déclarer une nouvelle variable, il peut en référencer une dans une portée externe.

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