2017-03-21 3 views
0

Je suis à la recherche de variables privées en JavaScript et je comprends la syntaxe pour eux, mais je suis curieux de savoir comment ils travaillent plus sous le capot avec les fonctions.javascript et variables privées

Il fonctionne semble déclarées dans une autre fonction, même après avoir été enregistré en tant que la valeur d'objet d'une variable externe, sont soit

  1. liée à la portée de la fonction externe et avoir accès à ses variables, OU
  2. la La valeur de la variable dans la fonction externe est simplement passée à la fonction interne (fermeture).

Lequel est-il ou est-ce quelque chose de différent que je n'ai pas pensé. grâce

function Cat(name,amt){ 
    this.name=name; 
    let num=amt;//private 
    let num2=5;//private 
    this.add=function(){//is privileged and has access to variables during object creation and is public 
     return num+num2; 
    } 
} 
Cat.prototype.scratch=function(){ 
    let amt= this.add(); 
    console.log(this.name + " scratched " + amt + " times."); 
} 

let spots= new Cat("spots", 5); 

Spots.scratch()// prints "spots scratched 10 times." 
+0

C'est 1). Ils ont accès aux * variables * de la portée dans laquelle ils ont été définis, pas aux valeurs. – Bergi

Répondre

1

Les noms et les valeurs des variables au sein d'une fonction sont maintenues dans un dossier de l'environnement créé lorsqu'une fonction est exécuté et maintenu dans son environnement lexical.

De l'article 8.1 de la spécification version standard ECMA 7:

A lexicale environnement est constitué d'un environnement de la fiche et une référence éventuellement nul à un environnement extérieur lexicale.

Donc, en effet la fonction intérieure a un compte rendu de ses propres variables et leurs valeurs, et un pointeur vers l'enregistrement de la fonction externe de ses variables et les valeurs et ainsi de suite jusqu'à ce qu'il ne fonctionne plus extérieures et la portée mondiale a été atteint.

Bien que LexicalEnvironment est une abstraction descriptive de la façon dont fonctionne script ECMA, en termes réels, cela signifie que si vous enregistrez une référence à une fonction interne en dehors de sa chaîne de portée, les variables qu'il utilise partout au sein de sa chaîne Scrope privée, non globale ne peut pas être collecté des déchets tant qu'une fonction interne ou des fonctions internes peuvent y accéder.

collecte des ordures mémoire Peut-être pourrait être optimisé pour recueillir la mémoire utilisée par des valeurs qui ne fonction intérieure qui continue d'exister fait les accès, mais je n'avais pas plus d'informations - voir les commentaires utiles.

+0

"* collecte de la mémoire utilisée par des valeurs qu'aucune fonction interne qui continue d'exister n'accède réellement *" - oui, cette optimisation est implémentée par ex. en V8 – Bergi