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 Réponses :
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);}
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
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.
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 code >. 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 i > 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.
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
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!
constne crée pas de propriété pour l'objet global comme le faitvar. Faites référence aux variables en utilisant leur nom. Notez qu'en mode strict,cecidansbonjourseraitindéfini, et votre code générerait une erreur.Pourquoi voulez-vous accéder à
unviathisen particulier?Associé , mais peut-être pas un dup, car le le sujet est
let.