Question Quel est le but du mot clé var et quand dois-je l'utiliser (ou l'omettre)?


REMARQUE: Cette question a été posée du point de vue de ECMAScript version 3 ou 5. Les réponses pourraient devenir obsolètes avec l'introduction de nouvelles fonctionnalités dans la version d'ECMAScript 6.


1389
2017-09-24 08:54


origine


Réponses:


Si vous êtes dans la portée globale, il n'y a pas de différence.

Si vous êtes dans une fonction alors var créera une variable locale, "no var" recherchera la chaîne de portée jusqu'à ce qu'elle trouve la variable ou atteigne la portée globale (à quel point elle la créera):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Si vous ne faites pas de devoir, vous devez utiliser var:

var x; // Declare x

1254
2017-09-24 08:55



Il y a une différence.

var x = 1  déclare variable  x dans la portée actuelle (aka contexte d'exécution). Si la déclaration apparaît dans une fonction - une variable locale est déclarée; si c'est dans une portée globale - une variable globale est déclarée.

x = 1, d'autre part, est simplement une cession de propriété. Il essaie d'abord de résoudre x contre la chaîne de portée. S'il le trouve n'importe où dans cette chaîne de portée, il effectue l'affectation; s'il ne trouve pas x, alors seulement ça crée x propriété sur un objet global (qui est un objet de premier niveau dans une chaîne de portée).

Maintenant, notez qu'il ne déclare pas de variable globale, il crée une propriété globale.

La différence entre les deux est subtile et pourrait être source de confusion, sauf si vous comprenez que les déclarations de variables créent également des propriétés (uniquement sur un objet Variable) et que toutes les propriétés dans Javascript (bien, ECMAScript) ont certains drapeaux qui décrivent leurs propriétés - ReadOnly, DontEnum et DontDelete.

Puisque la déclaration de variable crée la propriété avec le drapeau DontDelete, la différence entre var x = 1 et x = 1 (lorsqu'il est exécuté dans une portée globale) est que l'ancienne - déclaration de variable - crée la propriété DontDelete'able, et la dernière ne l'est pas. Par conséquent, la propriété créée via cette affectation implicite peut être supprimée de l'objet global, et la précédente, créée par une déclaration de variable, ne peut pas être supprimée.

Mais ce n'est que théorie, bien sûr, et en pratique, il y a encore plus de différences entre les deux, en raison de divers bogues dans les implémentations (telles que celles de IE).

J'espère que tout cela a du sens:)


[Mise à jour 2010/12/16]

Dans ES5 (ECMAScript 5, récemment standardisé, 5ème édition du langage), il existe un "mode strict" - un mode de langue opt-in, qui modifie légèrement le comportement des assignations non déclarées. En mode strict, l'assignation à un identificateur non déclaré est un ReferenceError. La raison de ceci était d'attraper des affectations accidentelles, empêchant la création de propriétés globales non désirées. Certains des navigateurs les plus récents ont déjà commencé à prendre en charge le mode strict. Voir, par exemple, ma table de compat.


695
2017-09-24 13:38



Dire que c'est la différence entre "local et global"n'est pas entièrement exact.

Il vaudrait peut-être mieux y voir la différence entre "local et la plus procheLe plus proche peut sûrement être global, mais ce ne sera pas toujours le cas.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

130
2017-09-24 09:50



Lorsque Javascript est exécuté dans un navigateur, tout votre code est entouré d'une instruction with, comme ceci:

with (window) {
    //Your code
}

Plus d'infos sur with - MDN

Depuis var déclare une variable dans le champ d'application actuel , il n'y a pas de différence entre déclarer var  fenêtre intérieure et ne pas le déclarer du tout.

La différence vient quand vous n'êtes pas directement dans la fenêtre, par ex. à l'intérieur d'une fonction ou à l'intérieur d'un bloc.

En utilisant var vous permet de masquer les variables externes ayant le même nom. De cette façon, vous pouvez simuler une variable "privée", mais c'est un autre sujet.

Une règle de base est de toujours utiliser var, car sinon vous courez le risque d'introduire des bugs subtils.

MODIFIER: Après les critiques que j'ai reçues, je voudrais souligner ce qui suit:

  • var déclare une variable dans le champ d'application actuel
  • La portée globale est window
  • N'utilise pas var déclare implicitement var dans la portée globale (fenêtre)
  • Déclarer une variable dans la portée globale (fenêtre) en utilisant var est le même que de l'omettre.
  • Déclarer une variable dans des étendues différentes de la fenêtre en utilisant var  n'est pas la même chose comme déclarant une variable sans var
  • Toujours déclarer var explicitement parce que c'est une bonne pratique

76
2017-09-24 09:17



Vous devriez toujours Utilisez le var mot-clé pour déclarer des variables. Pourquoi? Une bonne pratique de codage devrait être une raison suffisante en soi, mais déclarer une variable sans var mot-clé signifie qu'il est déclaré dans le global scope (une variable comme celle-ci s'appelle un "implicite" global). Douglas Crockford recommande de ne jamais utiliser des globales impliciteset selon le Apple JavaScript Coding Guidelines:

Toute variable créée sans le var   mot-clé est créé à l'échelle mondiale   et n'est pas ramassé les ordures lorsque le   retourne la fonction (parce qu'elle ne le fait pas   sortir du cadre), présentant le   possibilité d'une fuite de mémoire.

Donc, en bref, toujours déclarer les variables en utilisant le var mot-clé.


37
2017-09-24 09:52



Voici un bon exemple de comment vous pouvez être pris en dehors de ne pas déclarer les variables locales avec var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

(i est réinitialisé à chaque itération de la boucle, car il n'est pas déclaré localement dans le for boucle mais globalement) résultant finalement en boucle infinie


27
2017-09-24 09:31



Je dirais qu'il vaut mieux utiliser var dans la plupart des situations.

Les variables locales sont toujours plus rapides que les variables de portée globale.

Si vous n'utilisez pas var Pour déclarer une variable, la variable sera dans la portée globale.

Pour plus d'informations, vous pouvez effectuer une recherche sur "chaîne JavaScript" dans Google.


12
2017-09-24 09:02



une autre différence par exemple

var a = a || [] ; // works 

tandis que

a = a || [] ; // a is undefined error.

8
2017-08-09 22:11



En utilisant var C'est toujours une bonne idée d'empêcher les variables d'encombrer la portée et les variables globales d'entrer en conflit les unes avec les autres, causant un écrasement indésirable.


7
2018-04-04 23:14



Sans pour autant var - variable globale.

Fortement recommandé de TOUJOURS utilisation var déclaration, car la variable globale init dans le contexte local - est le mal. Mais, si vous avez besoin de cette astuce, vous devriez écrire un commentaire au début de la page:

/* global: varname1, varname2... */

7
2017-09-24 09:04



Ne pas utiliser var!

var était la manière pré-ES6 de déclarer une variable. Nous sommes maintenant A l'aveniret vous devriez coder comme tel.

Utilisation const et let

const devrait être utilisé pour 95% des cas. Cela fait que la référence de la variable ne peut pas changer, donc les propriétés du tableau, de l'objet et du noeud DOM peuvent changer et devraient être const.

let devrait être utilisé pour toute variable attendant d'être réaffectée. Cela inclut dans une boucle for. Si jamais tu écris varName = Au-delà de l'initialisation, utilisez let.

Les deux ont une portée au niveau du bloc, comme prévu dans la plupart des autres langues.


4
2017-08-15 18:49