3
votes

Où est stocké const lorsqu'il est déclaré?

Je suis un peu nouveau dans JS, en lisant le document de mozilla.org, j'ai lu que lors de la déclaration d'un const en global, il ne devient pas une propriété de l'objet global. Ma question est, si oui, où la propriété est-elle stockée?

Par exemple:

const a = 'HI!';

function hello() {
  console.log(this.a); // undefined
}

hello();

Ceci se déconnecte indéfini.

Au lieu de l'attribuer avec

global.a = 'HI!'

Existe-t-il d'autres moyens d'accéder à a avec this?


3 commentaires

const ne crée pas de propriété pour l'objet global comme le fait var . Faites référence aux variables en utilisant leur nom. Notez qu'en mode strict, ceci dans bonjour serait indéfini , et votre code générerait une erreur.


Pourquoi voulez-vous accéder à un via this en particulier?


Associé , mais peut-être pas un dup, car le le sujet est let .


3 Réponses :


1
votes

Il est déclaré dans le bloc dans lequel vous vous trouvez. Vous pouvez toujours y accéder à partir de la même portée de bloc (et des portées qui y sont déclarées), mais pas avec window.a ou global.a depuis n'importe quelle portée.

Donc - cela fonctionnerait:

window.a;
global.a;

Cependant, cela ne fonctionnerait pas:

const a = 1;

function b() {console.log(a);}


2 commentaires

Les fonctions fléchées ne sont pas explicitement nécessaires ici, la fonction deviendrait une fermeture


Vrai - j'ai édité l'article pour le rendre moins déroutant. @James



2
votes

Informations sur const :

Avec const, vous pouvez définir des variables immuables (constantes).

const a = 'HI!';

function hello() {
  console.log(this.a); // undefined <- this refer to function hello's scope
  console.log(a);   // HI!
}

Cependant, de nouveaux éléments peuvent toujours être poussé dans une constante de tableau ou ajouté à un objet.

const someArr = [3, 4, 5];
someArr.push(6);

Maintenant, accéder à la valeur dans la function en utilisant ce mot-clé, donnera de la valeur uniquement pour la portée du bloc de fonctions.

Donc, pour accéder à const une fonction interne, vous pouvez utiliser:

const PI = 3.1415;
PI = 5; // "TypeError: Assignment to constant variable.


2 commentaires

Salut! Merci pour votre réponse, dans votre dernier code, j'ai ajouté var a = 'Hello ~' dans la fonction hello , mais il se déconnecte toujours undefined . Si ceci fait référence à la portée de la fonction hello, pourquoi ne puis-je toujours pas y accéder. J'ai pensé que lorsque vous déclarez une fonction en dehors d'un objet, ceci signifie simplement l'objet global, puisque la consignation de la console ceci dans la portée globale vous donne fenêtre objet ou objet global .


vous pouvez accéder directement à var un journal de la console à l'intérieur de la fonction bonjour, pas besoin de l'utiliser.



3
votes

Si vous souhaitez accéder à une variable const ou let (ils se comportent de manière identique en termes d'accès) qui est dans une portée externe , alors vous pouvez le faire par nom

const a = 'HI!';

function hello() {
  console.log("access from context", this.a); 
}

hello(); //undefined - it's not in the context

const newContext = {a : a}; //the new value of "this"
hello.call(newContext); //HI!
hello.apply(newContext); //HI!

const boundFunction = hello.bind(newContext); //"this" will always be newContext for boundFunction
boundFunction(); //HI!

Cela fonctionne à moins que la variable ne soit masquée - une nouvelle variable avec le même nom est créée dans une portée interne

const outerVariable = 'HI!';

function hello() {
  const outerVariable = "impossible to access the outer declaration";
  console.log("access from inner scope", outerVariable); 
}

hello();

Si vous souhaitez y accéder en utilisant le contexte this , vous pouvez définir le contexte de la fonction en utilisant Function # call () , Function # apply () code > ou Fonction # bind () .

const outerVariable = 'HI!';

function hello() {
  console.log("access from inner scope", outerVariable); 
}

hello();

Dans ce cas, .call () et .apply () sont équivalents mais en général ils sont subtilement différents lorsque plus de paramètres sont passés


3 commentaires

Je suis un peu confus ici, donc ce que vous voulez dire, c'est que si je déclare une variable a avec const à portée globale, je ne peux toujours pas y accéder en utilisant global.a ?


@ user8480342 Les variables let et const n'ajoutent pas de propriété à l'objet global lorsqu'elles sont déclarées dans la portée globale. C'est ainsi que leur spécification a été écrite, donc le comportement est cohérent avec cela. Il est différent des déclarations var qui ajoutent explicitement une propriété à l'objet global lorsqu'il est déclaré dans la portée globale.


Je l'ai. Merci pour votre réponse!