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 ?
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 ?
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.
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 ?
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.
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.
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);
@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 .. = ..
.
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.
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.
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.
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, maisconsole.out(myObj=1)
sorties 1. voir ma réponse (actuellement tout en bas)