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?
Réponses
Trop de publicités?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
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.
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;
}
}
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 implicitementvar
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
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é.