Ceci est un script simple qui va enregistrer le contenu du texte à partir d'un fichier Photoshop. Cela fonctionne très bien, mais je devrais vraiment passer une chaîne dans la fonction à ajouter à elle-même, mais cela fonctionne. Comment la portée de JavaScript permet-elle cela? Est-ce que les variables locales déclarées sont toujours accessibles par les fonctions ou est-ce un autre truc qui me manque?Portée dans le comportement JavaScript
Répondre
Voici quelques règles de base à la portée des variables en JavaScript:
- Si défini avec le mot-clé
var
, la variable est fonction scope. Autrement dit, la variable sera étendue à la fonction conteneur la plus proche ou au contexte global s'il n'y a pas de fonction conteneur. Exemple:
// globally-scoped variable (no containing function)
var foo = 'bar';
function test() {
// function-scoped variable
var foo2 = 'bar2';
if (true) {
// still function-scoped variable, regardless of the if-block
var foo3 = 'bar3';
}
// see?
console.log(foo3); // --> 'bar3'
}
- Si défini avec le mot-clé
let
(ES6 +), la variable est scope bloc (ce comportement ressemble plus à la plupart des autres langues de syntaxe C-familiale). Exemple:
// error: top level "let" declarations aren't allowed
let foo = 'bar';
function test() {
// block-scoped variable (function are blocks, too)
let foo2 = 'bar2';
if (true) {
// block-scoped variable (notice the difference
// from the previous example?)
let foo3 = 'bar3';
}
// uh oh?
console.log(foo3); // --> ReferenceError: foo3 is not defined
}
- Si défini avec ni les
var
oulet
mots-clés (par exemple,foo = bar
), la variable est scope au contexte mondial. Exemple:
// globally-scoped variable
foo = 'bar';
function test() {
// also globally-scoped variable (no var or let declaration)
foo2 = 'bar2';
if (true) {
// still a globally-scoped variable
foo3 = 'bar3';
}
}
test();
console.log(foo, foo2, foo3); // 'bar', 'bar2', 'bar3'
Dans tous ces cas, les fonctions définies dans la portée d'une variable ont encore accès à la variable elle-même (vous techniquement la création d'une fermeture, comme les numOfLayers
et resultStr
variables sont lexicalement portée de vos fonctions addToString
et doAllLayers
).
Veuillez noter que les règles de portée sont techniquement un peu plus nuancées que cela, mais il vaut mieux lire un article plus approfondi à ce stade.
Vous avez défini la fonction externe var resultStr = "";
qui est une variable globale. Vous pouvez accéder à cette variable globale à addToString()
et commencer à la concaténer. Notez qu'à l'intérieur de la méthode vous n'avez pas déclaré var resultStr = "";
sinon cela aurait été une variable différente locale à cette méthode.
quel est le problème, le code me semble bien. – atinder
Je ne suis pas sûr si je l'ai bien compris, mais vous ne passez pas de chaîne ici, thisLayer est un objet que vous passez. – abs
@atinder - J'ai juste besoin d'une meilleure compréhension de la portée en JavaScript –