Maison >interface Web >js tutoriel >Explication détaillée de la portée + fermeture en Javascript
[[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 : BAO2 : 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
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)
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 JavaScriptfunction test(){ var arr = []; for(var i = 0;i < 10;i ++){ (function (j){ arr[j] = function(){ document.write(j+' '); } }(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!