La chaîne de portée de JavaScript est-elle déterminée lorsqu'une fonction est définie ou lorsqu'elle est appelée ?
欧阳克
欧阳克 2017-07-05 10:42:15
0
5
1203

Voir le problème de fermeture suivant

var x=10;
function fn() {
    console.log(x);
}

function show(f) {
    var x=20;

    (function() {
        f();
    })();
}
show(fn);

Il imprime 10 au lieu de 20. Lorsque x est pris, ne recherche-t-il pas le long de la chaîne de portée ? Si la chaîne de portée est déterminée lors de la création de la fonction, le résultat sera 10. Si elle est déterminée lorsque la fonction est créée appelé, il devrait être 20. Oui Aucune déclaration précise sur la chaîne de portée ? À quoi devrait ressembler la chaîne de portée exacte ici ? Est-ce que fn et show sont au même niveau ou est-ce que fn est dans show ?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

répondre à tous(5)
学霸

La chaîne de portée est déterminée lorsque la fonction est définie.

Les variables définies dans une fonction ne sont accessibles nulle part en dehors de la fonction, car les variables ne sont définies qu'à l'intérieur du domaine de la fonction. De manière correspondante, une fonction peut accéder à toutes les variables et fonctions définies dans sa portée. En d'autres termes, une fonction définie dans la portée globale peut accéder à toutes les variables définies dans la portée globale. Une fonction définie dans une autre fonction peut également accéder à toutes les variables définies dans sa fonction parent et à toute autre variable à laquelle la fonction parent a accès.

https://developer.mozilla.org...

習慣沉默

La chaîne de périmètre est dynamique, elle est donc déterminée au moment de l'appel.
Mais dans votre code, la fonction() définie par la fermeture est la portée la plus externe de la liaison
La fonction déclarée par fonction est par défaut la portée la plus externe de la liaison

(J'apprends aussi...)

洪涛

Créez une chaîne de portée contenant des objets variables globales lors de la création de la fonction et stockez-la dans l'attribut interne [[Scope]]. Lorsque la fonction est exécutée, un environnement d'exécution sera créé en copiant les objets dans l'attribut [[Scope]], la chaîne de portée de l'environnement d'exécution sera construite et ses propres objets actifs seront poussés dans le front-end de. la chaîne de portée pour former une chaîne de domaines de fonction complète. [[Scope]] contient une référence à la variable globale, pas une copie de la valeur.

var a = 10;
function f(){
    console.log(a);
};
function foo(){
    a = 20;
    f();
};
foo() // 20;
阿神

La méthode d'appel de fermeture est équivalente à l'effet suivant. L'exemple ci-dessous illustre par comparaison que la chaîne de portée est liée à la position lorsque la fonction est définie.

var x=10;
function fn(){
    console.log(x);
}
function show() {
    var x=20;
    fn();
}
show();  //输出10
-----------------------
var x=10;
function show() {
    var x=20;
    function fn(){
        console.log(x);
    }
    fn();
}
show();  //输出20

Liens de questions pertinents ajoutés. /q/10…. Il y a une discussion sur les chaînes de portée.

扔个三星炸死你

En mode non strict, ce point de tout IIFE est la fenêtre

Ce qui précède n'est pas correct. . .

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal