Maison  >  Article  >  interface Web  >  Explication détaillée de la portée + fermeture en Javascript

Explication détaillée de la portée + fermeture en Javascript

php是最好的语言
php是最好的语言original
2018-08-04 10:45:072521parcourir

Portée :

[[portée]] :Chaque fonction javascript est un objet, et il y a certains attributs dans l'objet que nous sommes accessibles, mais certaines ne le peuvent pas. Ces propriétés ne sont accessibles qu'au moteur JavaScript, et [[scope]] en fait partie.

[[scope]] fait référence à ce que nous appelons scope, qui stocke une collection de contextes d'exécution. Contexte d'exécution : Lorsqu'une fonction est exécutée, un objet interne appelé contexte d'exécution est créé. Un contexte d'exécution définit l'environnement dans lequel une fonction est exécutée. Le contexte d'exécution correspondant est unique à chaque fois que la fonction est exécutée, donc appeler une fonction plusieurs fois. entraînera la création de plusieurs contextes d'exécution. Lorsque la fonction termine son exécution, le contexte d'exécution qu'elle a généré sera détruit.

Chaîne de portée : une collection d'objets de contexte d'exécution stockés dans [[scope]]. Cette collection est connectée dans une chaîne. Nous appelons ce maillon de chaîne une portée.

function a(){
    function b(){
        function c(){
        }
    }    

}

a défini a.[[scope]] ===> 0 : GO

a faisant a.[[scope]] ===> 🎜>

b défini b. [[portée]] ===> 0 : bAO

                      1 : aAO

                      ​ ​ ​ 2 [ [portée]] = ==>0 : cAO

1 : BAO

2 : AAO

3 : GO

Fermeture

Lorsque l'interne la fonction est préservée à l'extérieur, la fermeture sera générée, la fermeture empêchera la chaîne de portée d'origine d'être libérée, provoquant des fuites de mémoire.

Une fonction renvoie la fonction b avant qu'elle ne soit détruite, donc la chaîne de portée générée par la fonction b n'est pas détruite, et la fonction b n'est pas détruite à ce moment Exécution , lorsque console.log(aaa) est appelé ci-dessous, la fonction b est exécutée. Il n'y a pas de variable aaa dans bAO, donc aaa = 123 se trouve dans l'aAO parent, donc le résultat est 123.

Donc. , comment exécuter la fonction b avant de revenir ?

Introduction de

Fonction d'exécution immédiate

Fonction d'exécution immédiate, pour la fonction de fonction d'initialisation,
function a(){
    function b(){
        var bbb = 234;
           console.log(aaa);
    }
    var aaa = 123;
    return b;
}
var glob = 100;
var demo = a();
demo();

1 (function(){}(). ); (w3c recommande la première) Explication détaillée de la portée + fermeture en Javascript

2. (function(){})();

Seules les expressions peuvent être exécutées symboliquement

Exécutées symboliquement immédiatement après le expression de fonction, la fonction ne peut plus être utilisée

La fonction peut être convertie en expression de fonction via le signe plus, le signe moins, etc.

+/-/! function test(){

console.log('a');

}

Le résultat de sortie est : 1 2 3 4 5 6 7 8 9

Articles connexes :

Explication détaillée de la portée et de la fermeture de JavaScript

Chaîne de portée et fermeture en JavaScript

function test(){
    var arr = [];
    for(var i = 0;i < 10;i ++){
        (function (j){
            arr[j] = function(){
                document.write(j+&#39; &#39;);    
            }
        }(i));
    }
    return arr;
	}
	var myarr = test();
	for(var i = 0;i < 10;i ++){
   	     myarr[i]();
    }
Vidéos associées :

JS Advanced Scope - Tutoriel vidéo avancé Javascript de Yan Shiba

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn