Une fermeture est une fonction qui a accès à une variable dans le cadre d'une autre fonction.
Le plus courant est de créer une autre fonction à l'intérieur d'une fonction. Prenons l'exemple de la fonction TrialFunction() :
function TrialFunction(property) { return function(a, b) { var a1 = a[property]; var b1 = b[property]; if (a1 < b1) { return -1; } else if (a1 > b1) { return 1; } else { return 0; } }; }
Dans le code ci-dessus, la fonction interne accède à la propriété variable dans la fonction externe. Même si la fonction interne est renvoyée et appelée ailleurs, d'autres peuvent toujours accéder à la variable de propriété.
Cela se produit parce que la chaîne de portée de cette fonction interne inclut la portée de TrialFunction.
Lorsqu'une fonction est appelée, un environnement d'exécution (Contexte d'exécution) et la chaîne de portée correspondante seront créés. Par la suite, l'objet d'activité de la fonction est initialisé en utilisant les valeurs des arguments et autres paramètres nommés. Mais dans la chaîne de portée, l'objet actif de la fonction externe est toujours en deuxième place, l'objet actif de la fonction externe de la fonction externe est en troisième place, et enfin jusqu'à l'environnement d'exécution global en tant que chaîne de portée.
Lors de l'exécution de la fonction, afin de lire et d'écrire la valeur d'une variable, vous devez trouver la variable dans la chaîne de portée.
Ce mécanisme de chaîne de portée entraîne un effet secondaire, c'est-à-dire que la fermeture ne peut obtenir que la dernière valeur de n'importe quelle variable dans la fonction conteneur.
Par exemple :
function example() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function() { return i; } } return result; }
Cette fonction renverra un tableau. Généralement, tout le monde pensera que chaque fonction doit renvoyer son propre index, c'est-à-dire [0, 1, 2, ...9. ]; mais en fait, chaque fonction renvoie 10.
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!