Maison  >  Article  >  interface Web  >  Exemple détaillé de chaîne de portée en JavaScript

Exemple détaillé de chaîne de portée en JavaScript

黄舟
黄舟original
2017-11-01 10:13:331393parcourir

RévisionPortée

Nous avons parlé de portée dans la section précédente : elle fait référence à la portée à laquelle une variable peut accéder, et il stipule Comment trouver les variables et déterminer les droits d'accès du code en cours d'exécution aux variables ; en parlant également de portée statique, c'est-à-dire de portée lexicale, qui détermine la référence du variable lors de la phase de compilation (définie par le programme). La position est déterminée, quel que soit l'ordre d'exécution du code, et est analysée de manière imbriquée.

Ning a demandé

var x=10;
    function run(){
        var name='Joel';
        console.log(x+name);//10Joel  这里做了隐适转换 当有+时有一个为string 那么会当做字符拼接来处理
    }
    run();

Comme indiqué dans le code ci-dessus, lors de l'exécution de la fonction d'exécution, il y a une variable de nom dans la portée d'exécution, mais il n'y en a pas variable x, alors pourquoi pas. Une erreur sera signalée. Comment accède-t-on à la variable x ? Certaines personnes peuvent comprendre qu'il s'agit de rechercher des variables dans la portée de la fonction parent . En fait, il y a une ambiguïté dans la compréhension de la portée de cette façon (si vous comprenez que vous appelez la fonction parent de la fonction, alors c'est définitivement faux. Le code suivant), Dans la section précédente, nous avons dit que la portée de javascript est une portée statique, c'est-à-dire que devrait se soucier de l'emplacement du définition du code plutôt que l'emplacement de l'appel (portée lexicale) ;

var x=10;
    function fn(){
        console.log(x);
    }
    function show(f){
        var x=20;
        (function(){
            f()
        }());
    }
    show(fn);//10 并不是20

Introduire la chaîne de portée

Comprendre la chaîne de portée en analyser la résolution variable de la portée

var a=10;
    function run(){
        var name='Joel';
        function say(){
            var content='hello';
            console.log(content+name+','+a);
        }
        say();
    }
    run();//helloJoel,10

D'après l'article précédent, nous savons que la portée js a une portée globale et une portée de fonction, donc la portée du code ci-dessus est la suivante suit :

Portée globale : il existe bien sûr des références aux variables a et aux fonctions d'exécution. Il existe également d'autres fonctions et attributs (ceux intégrés ne seront pas abordés

) ;

exécuter la portée de la fonction : il y a un nom de variable et dire des références à la fonction ;

dire la portée de la fonction :Le contenu de la variable existe

Lorsque le code est exécuté sur console.log(content+name+; ','+a); Tout d'abord, recherchez le contenu des variables, le nom et a dans la portée de la fonction, si trouvé, arrêtez Non. Si trouvé, recherchez dans la portée globale de la fenêtre. la variable a n'est pas trouvée dans la portée actuelle, recherchez dans la portée d'exécution. Si elle n'est pas trouvée, recherchez dans la portée globale. Si elle n'est toujours pas trouvée, une erreur est signalée : "n'est pas définie" car la portée globale. est la portée la plus externe ;

Continuez à regarder le code suivant. Après avoir défini le nom de la variable dans la fonction say, la valeur du nom n'est plus dans la fonction run La valeur dans le domaine. le nom est trouvé dans la portée, il ne continuera pas à chercher

<script>
    var a=10;
    function run(){
        var name=&#39;Joel&#39;;
        function say(){
            var content=&#39;hello&#39;,name=&#39; Word&#39;;

            console.log(content+name+&#39;,&#39;+a);
        }
        say();
    }
    run();//hello Word,10
</script>

Ce processus étape par étape de recherche de variables est appelé analyse d'identifiant, ou vous pouvez comprendre Pour la résolution des variables, le Le mécanisme permettant de fournir cette ligne ou de trouver des variables de cette manière est appelé une chaîne de portée ;

Résumons ce processus :

La première étape, dans la portée actuelle, trouve la variable, obtient s'il y en a un et arrêtez-vous. Sinon, continuez à rechercher la portée précédente ;

La deuxième étape, si la portée actuelle est la portée globale, cela signifie que la variable n'est pas définie, terminez sinon, continuez ; troisième étape (pas la portée globale, c'est la portée de la fonction) Passez à la première étape

Alors, qu'est-ce que la chaîne de portée exactement ?

En fait, la chaîne de portée est essentiellement une liste chaînée de pointeurs pointant vers des objets variables. Elle fait uniquement référence mais ne contient pas réellement la valeur de l'objet variable ;

La structure de la chaîne de portée de ; le code ci-dessus est similaire à ceci :

Cet article présente uniquement la chaîne de portée. Le prochain article commencera officiellement à parler de l'environnement d'exécution, qui impliquera des objets variables, objets actifs, chaînes de portée, etc., afin d'approfondir le processus de création de la chaîne de portée.

La raison pour laquelle nous devons d'abord écrire l'environnement d'exécution est que la chaîne de portée complète est construite dans l'environnement d'exécution.

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