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)
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éeLa 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!