1646 votes

Quelle est la fonction du mot-clé var et quand l'utiliser (ou de les omettre)?

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

Quelle est exactement la fonction de l' var mot-clé en Javascript, et quelle est la différence entre:

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

et:

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

Quand souhaitez-vous utiliser soit l'un, et pourquoi/pour quoi faire?

1407voto

Greg Points 132247

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

Si vous êtes dans une fonction de "var" va créer une variable locale, "aucun var" va chercher le champ d'application de la chaîne jusqu'à ce qu'il trouve la variable ou de la frappe de la portée mondiale (qui sera le créer):

// 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 n'êtes pas faire une mission, alors vous devez utiliser var:

var x; // Declare x

771voto

kangax Points 19954

Il y a une différence.

var x = 1 déclare la variable x à périmètre courant (aka contexte d'exécution). Si la déclaration s'affiche dans une fonction de variable locale est déclarée; si elle est dans la portée globale globale variable est déclarée.

x = 1, d'autre part, n'est qu'une affectation de propriété. Il tente d'abord de résoudre x contre champ d'application de la chaîne. Si elle trouve n'importe où dans le champ d'application de la chaîne, il effectue l'affectation; si il ne trouve pas d' x, alors seulement il crée x de la propriété sur un objet global (qui est d'un haut niveau d'objet dans une chaîne de domaine).

Maintenant, remarquez qu'il ne veut pas déclarer une variable globale, il crée une propriété globale.

La différence entre les deux est subtile et peut être source de confusion si vous ne vous comprenez que les déclarations de variables aussi créer des propriétés (uniquement sur un Objet Variable) et que tous les biens de Javascript (bien, ECMAScript) ont certains indicateurs décrivant leurs propriétés En lecture seule, DontEnum et DontDelete.

Depuis la déclaration de la variable crée propriété avec DontDelete drapeau, la différence entre var x = 1 et x = 1 (lors de l'exécution dans la portée globale) est que les anciens d'une déclaration de variable - crée DontDelete'able de la propriété, et celui-ci ne fonctionne pas. En conséquence, les biens créés par l'intermédiaire de cette affectation implicite peut alors être supprimé à partir de l'objet global, et de l'ancienne - celle créée par la déclaration de la variable - ne peut pas être.

Mais c'est de la baie vitrée, de la théorie de cours, et , dans la pratique, il y a plus de différences entre les deux, à cause de divers bugs dans les implémentations (comme celui de IE).

J'espère que tout fait sens : )

[Mise à jour 2010/12/16]

Dans l'ES5 (ECMAScript 5; récemment normalisé, la 5ème édition de la langue), il y a un soi-disant "mode strict" - opt-dans la langue de mode, ce qui modifie légèrement le comportement de non déclarées affectations. En mode strict, l'affectation à un identificateur non déclaré est un ReferenceError. La raison pour cela était de capture accidentelle des affectations, qui empêche la création des indésirables, propriétés à l'échelle mondiale. Certains navigateurs plus récents ont déjà commencé à déployer le support pour le mode strict. Voir, par exemple, mon compat table.

142voto

Jonathan Lonowski Points 45253

En disant que c'est la différence entrelocal et global" n'est pas tout à fait exacte.

Il pourrait être préférable de penser à cela comme la différence entre lelocal et le plus proche". Le plus proche peut sûrement être mondial, mais qui 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;
    }
}

85voto

kentaromiura Points 3361

Lorsque le Javascript est exécuté dans un navigateur, votre code est entouré par une instruction, comme suit:

with (window) {
    //Your code
}

Plus d'infos sur with - MDN

Depuis var déclare une variable dans la portée actuelle , il n'existe pas de différence entre déclarant var à l'intérieur de la fenêtre et de ne pas déclarer à tous.

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

À l'aide de var vous permet de masquer des variables externes qui ont le même nom. De cette façon, vous pouvez simuler un "privé" de la variable, mais c'est un autre sujet.

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

EDIT: Après les critiques que j'ai reçu, je voudrais souligner les points suivants:

  • var déclare une variable dans la portée actuelle
  • La portée mondiale est - window
  • Ne pas utiliser var déclare implicitement var dans la portée globale (fenêtre)
  • La déclaration d'une variable dans la portée globale (fenêtre) à l'aide d' var est le même que si c'.
  • La déclaration d'une variable dans les étendues différente de la fenêtre à l'aide d' var n'est pas la même chose que de déclarer une variable sans l' var
  • Toujours déclarer var explicitement parce que c'est une bonne pratique

50voto

Steve Harrison Points 31062

Vous devriez toujours utiliser l' var mot clé de déclarer les variables. Pourquoi? Les bonnes pratiques de codage devrait être une raison suffisante en soi, mais la déclaration d'une variable sans l' var mot-clé signifie qu'il est déclaré dans le mondial portée (une variable comme ceci est appelé un "implicite" global). Douglas Crockford recommande de ne jamais utiliser l'implicite globals, et selon l' Apple JavaScript Directives de Codage:

Toute variable créée sans l' var mot-clé est créée à la portée globale et n'est pas des ordures collectées lors de l' la fonction retourne (car il n'a pas aller hors de portée), la présentation de l' l'occasion pour une fuite de mémoire.

Donc, en bref, toujours déclarer des variables à l'aide de l' var mot-clé.

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