2015-07-21 2 views
0

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

+0

quel est le problème, le code me semble bien. – atinder

+0

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

+0

@atinder - J'ai juste besoin d'une meilleure compréhension de la portée en JavaScript –

Répondre

1

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 ou let 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.

0

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.