Je ne peux pas comprendre pourquoi les variables agissent si étrangement lorsqu'elles sont déclarées dans une fonction.
Dans la
first
fonction je déclare aveclet
les variablesb
etc
avec la valeur 10 :b = c = 10;
Dans la
second
fonction je montre:b + ", " + c
Et cela montre:
10, 10
Toujours dans la
first
fonction, je déclarea
avec la valeur 10 :let a = b = c = 10;
Mais dans la
second
fonction, il montre une erreur:Impossible de trouver la variable:
a
Maintenant, dans la
first
fonction que je déclared
avec la valeur 20 :var d = 20;
Mais dans la
second
fonction, il affiche la même erreur que précédemment, mais avec la variabled
:Impossible de trouver la variable:
d
Exemple:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
javascript
variable-declaration
interférence de bêlement
la source
la source
b
etc
ne sont pas préfixés par levar
mot - clé.a
etd
sont locaux àfirst
.Dim Apple, Banana, Pear As Fruit
signifieDim Apple / Dim Banana / Dim Pear As Fruit
, et nonDim Apple As Fruit / ...
.Réponses:
C'est parce que vous dites en fait:
Et pas ce que vous pensez dire, c'est-à-dire:
Vous remarquerez que peu importe le nombre de variables que vous ajoutez à votre chaîne, ce ne sera que la première (a) qui cause l'erreur.
C'est parce que "let" étend votre variable au bloc (ou, "localement", signifiant plus ou moins "entre crochets") dans lequel vous le déclarez.
Si vous déclarez une variable sans "let", elle étend la variable globalement.
Ainsi, dans la fonction où vous définissez vos variables, tout obtient la valeur 10 (vous pouvez le voir dans le débogueur si vous mettez un point d'arrêt). Si vous mettez un journal de console pour a, b, c dans cette première fonction, tout va bien.
Mais dès que vous quittez cette fonction, la première (a) - et encore une fois, gardez à l'esprit, techniquement dans l'ordre d'affectation, c'est la dernière - "disparaît" (encore une fois, vous pouvez le voir dans le débogueur si vous définissez un point d'arrêt dans la deuxième fonction), mais les deux autres (ou le nombre que vous ajoutez) sont toujours disponibles.
En effet, "let" S'APPLIQUE UNIQUEMENT (donc uniquement aux étendues locales) LA PREMIÈRE VARIABLE - encore une fois, qui est techniquement la dernière à être déclarée et à laquelle une valeur a été attribuée - dans la chaîne. Techniquement, les autres n'ont pas "laissé" devant eux. Donc, ceux-ci sont techniquement déclarés globalement (c'est-à-dire sur l'objet global), c'est pourquoi ils apparaissent dans votre deuxième fonction.
Essayez-le: supprimez le mot clé "let". Tous vos vars seront désormais disponibles.
"var" a un effet de portée locale similaire, mais diffère dans la façon dont la variable est "hissée", ce que vous devez certainement comprendre, mais qui n'est pas directement impliqué dans votre question.
(BTW, cette question serait assez époustouflante pour les développeurs JS pro pour en faire une bonne).
Je vous suggère fortement de passer du temps avec les différences dans la façon dont les variables peuvent être déclarées dans JS: sans mot-clé, avec "let" et avec "var".
la source
var
pluslet
dans le cadre de cette réponse? Je ne comprends pas.var
peut être sujet à des bogues s'il est utilisé avec négligence. Vérifiez ce violonvar
-il un avantage surlet
? Permettez-moi de clarifier: un contexte moderne où les deux sont des options et je demande du code que l'on devrait écrire. Quand j'ai posé cette question auparavant, j'ai reçu des réponses sur "vous pouvez re-déclarer une variable avecvar
", auquel cas je dois rappeler aux gens que vous ne devriez pas redéclarer des variables . C'est soit un bug, soit une erreur dans la logique du code - donc l'avantage de la re-déclaration est ... qu'elle vous permet d'écrire du code défectueux. Je n'ai pas encore vu de raison valable en faveur devar
quandlet
est également une option.Dans la fonction
first()
, les variablesb
etc
sont créées à la volée, sans utiliservar
oulet
.Est différent de
Ils deviennent implicitement mondiaux. C'est pourquoi ils sont disponibles en
second()
De la documentation
Pour éviter cela, vous pouvez utiliser
"use strict"
qui fournira des erreurs lorsque l'on utilise une variable non déclaréela source
let a = 10, b = 10, c = 10;
oulet a, b, c; a = b = c = 10;
serait autrement une façon correcte de déclarer les variables.b
ne sera pas évaluée / atteinte, l'erreur se produira sur la lignelet a = b = c = 10;
, lue de droite à gauche .c
étant la première variable à l'origineReferenceError
, le reste de la ligne ne sera pas exécuté (le script s'est arrêté)let a = 10, b = a, c = b;
est aussi valableAvant d'appeler des choses étranges, connaissons d'abord quelques notions de base:
var et let sont tous deux utilisés pour la déclaration de variables en JavaScript. Par exemple,
Les variables peuvent également être déclarées sans utiliser
var
oulet
. Par exemple,Maintenant, la différence entre les approches ci-dessus est que:
var
est fonction portéeet
let
a une portée de bloc.Maintenant, selon ces concepts, regardons le code en question:
la source
var
mot - clé devient globale indépendamment de l'endroit où elle est déclarée" devrait être soit "la portée ... devient" ou "la portées ... deviennent " . Utiliser les mots exacts de quelqu'un d'autre nécessite une citation, que ce soit d'ici ou d'ailleurs. meta.stackexchange.com/q/160071/211183Les variables utilisant le
let
mot - clé ne doivent être disponibles que dans le cadre du bloc et non disponibles dans une fonction externe ...Chaque variable que vous déclarez de cette manière n'utilise pas
let
ouvar
. Il manque une virgule dans la déclaration des variables.Il n'est pas recommandé de déclarer une variable sans le
var
mot clé. Il peut accidentellement remplacer une variable globale existante. La portée des variables déclarées sans levar
mot clé devient globale quel que soit l'endroit où il est déclaré. Les variables globales sont accessibles de n'importe où dans la page Web.la source
C'est parce que vous n'utilisez pas
let
ou que lavar
variable est déclarée à la volée, mieux vous déclarez comme suit.la source
L'étrange problème est dû aux règles de portée en JavaScript
En supposant que vous souhaitez déclarer 3 variables locales initialisées à la même valeur (100). Votre premier () ressemblera à ci-dessous. Dans ce cas, second () n'aura accès à aucune des variables car elles sont locales à first ()
Cependant, si vous voulez des variables globales, votre premier () ressemblera à ci-dessous. Dans ce cas, second aura accès à toutes les variables car elles sont de portée globale
Variables locales (aka. Accessibles dans le bloc de code où elles sont déclarées).
Un bloc de code est un {} avec une ou plusieurs lignes de code entre.
Variables globales (alias accessibles dans la portée globale).
Ces variables sont attachées à l'objet global. L'objet global dépend de l'environnement. C'est l'objet fenêtre dans les navigateurs.
Remarque spéciale: vous pouvez déclarer des variables en JavaScript sans utiliser les mots clés var, let, const. Une variable déclarée de cette façon est attachée à l'objet global, donc accessible dans la portée globale.
a = 100 // is valid and is in global scope
Quelques articles pour plus de lecture: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / communauté / tutoriels / comprehension-variables-scope-hoisting-in-javascript
la source
La principale différence réside dans les règles de portée. Les variables déclarées par le mot clé var sont étendues au corps de la fonction immédiate (d'où l'étendue de la fonction) tandis que les variables let sont étendues au bloc englobant immédiat désigné par {} (d'où l'étendue du bloc). Et quand tu dis
c et b ont la durée de vie aussi amusante que la durée d'un bloc et si vous essayez d'accéder à a en la référençant, il affiche toujours une erreur mais c et b sont globalement donc ils ne le font pas. variables que vous ajoutez à votre chaîne, ce ne sera que la première (a) qui provoque l'erreur. C'est parce que "laisser" étend votre variable au bloc (ou, "localement", plus ou moins signifiant "entre crochets") dans lequel vous la déclarez. Si vous déclarez une variable sans "let", elle étend la variable globalement. Donc, dans la fonction où vous définissez vos variables, tout obtient la valeur 10 (vous pouvez le voir dans le débogueur si vous mettez un point d'arrêt). Si vous mettez un journal de console pour a, b, c dans cette première fonction, tout va bien, mais dès que vous quittez cette fonction, la première (a) - et encore une fois, gardez à l'esprit,
la source
Voici les 3 aspects intéressants des déclarations de variables en JavaScript:
var restreint la portée de la variable au bloc dans lequel elle est définie. ( 'var' est pour la portée locale .)
let permet de remplacer temporairement la valeur d'une variable externe à l'intérieur d'un bloc.
La simple déclaration d'une variable sans var ou let rendra la variable globale, quel que soit l'endroit où elle est déclarée.
Voici une démo de let , qui est le dernier ajout à la langue:
Production:
Explication:
Les variables a et b ont été supprimées à l'intérieur de ' first () ', sans mots-clés var ou let.
Par conséquent, a et b sont globaux et sont donc accessibles tout au long du programme.
Dans la fonction nommée 'second' , l'instruction 'let a = 5' définit temporairement la valeur de ' a ' à ' 5 », dans le cadre de la fonction uniquement.
En dehors de la portée de « second () », IE, dans la portée globale, la valeur de « a » sera telle que définie précédemment.
la source