2015-11-25 1 views
0

Voici l'exemple sur lequel je veux m'éclairer (Quelque chose qui ne fonctionne pas réellement).Étendre la chaîne en Javascript et appeler la fonction imbriquée dans la portée globale

var myVar = 2; 

    function a(){ 
    var myVar = 2; 
     function b(){ 
      console.log(myVar); 
     } 
    }; 
    a(); 
    b(); 

Ceci sera affiché dans la console: Uncaught ReferenceError: b n'est pas défini.

Comme vous pouvez le voir, j'ai une fonction nommée un avec une fonction imbriquée appelée b.

Au début, je pensais que je pouvais invoquer b en dehors un et le faire fonctionner normalement. Je pensais que cela fonctionnerait parce que j'appelle d'abord la fonction a.

En faisant que j'avais à l'esprit le fait que la fonction serait mise sur la pile d'exécution et pendant sa phase de création de la fonction b définie à l'intérieur serait fixé dans la mémoire. Comme c'est en mémoire, j'ai pensé que je pourrais alors exécuter ceci en dehors de la fonction. Ce qui ne marche évidemment pas.

Donc, ma conclusion est la fonction b est en effet mis en mémoire pendant la phase de création du une fonction mais une fois la fonction a fini d'exécuter, une fois qu'il est sauté de la pile d'exécution, le b La fonction est supprimée de la mémoire en même temps.

L'appeler ainsi (je veux dire la fonction b) dans la portée globale est impossible.

Ai-je raison à ce sujet?

+0

JavaScript a [* lexical scope *] (https://en.wikipedia.org/wiki/Scope_%28computer_science%29#Lexical_scoping) et cela s'applique aussi aux fonctions. –

Répondre

3

Vous compliquez les choses inutilement en parlant de piles d'exécution, de phases de création et autres.

L'explication est très simple: vous ne pouvez pas appeler b car la spécification indique que b est hors de portée sur le site où vous essayez de l'appeler. C'est tout, fin de l'histoire.

Votre exemple fonctionnerait réellement si converti en PHP, ce qui me fait penser que c'est peut-être là que vous avez eu l'idée. Mais JS et PHP sont des langages différents et la manière (IMO ridicule) que PHP traite les fonctions imbriquées ne se transfère pas.

+0

Oui, vous avez raison, j'essaie d'aller trop loin dans la réflexion ... Je savais que je ne peux pas le faire en Javascript, mais j'essayais de comprendre pleinement pourquoi. Tout le mécanisme invendu.Mais en fait, c'est encore plus simple. L'explication est la fonction nommée 'b' dans la fonction nommée 'a'. Puis Il échoue lorsque nous essayons de l'appeler de la portée globale, car l'environnement d'exécution global cherchera la fonction b, mais qui n'a jamais été ajoutée à son environnement variable lors de la phase de création du contexte d'exécution globale ... En résumé, ils ne sont pas dans la même portée que vous m'avez dit. THX – Azuk

0

Si vous voulez appeler b en dehors de a, vous devez créer une référence à l'extérieur de a:

var myVar = 2; 

function a(){ 
    var myVar = 2; 
    function b(){ 
     console.log(myVar); 
    } 
    return b; 
}; 

var b = a(); 
b(); 

Cela ne causera toutefois b à imprimer le myVar global. Il aura toujours accès au myVar à l'intérieur de la portée de fermeture a.