Maison  >  Article  >  interface Web  >  Analyser les questions sur la portée de JavaScript

Analyser les questions sur la portée de JavaScript

怪我咯
怪我咯original
2017-05-07 11:46:39942parcourir

Tous ceux qui ont écrit un programme connaîtront le concept de portée. Dans cet article, parlons de la portée de Javascript.

En Javascript, l'environnement global lui-même est un objet. Dans l'hôte du navigateur, cet objet est une fenêtre, mais lorsque Javascript est utilisé dans d'autres hôtes non-navigateurs, tels que des environnements intégrés, il peut s'agir d'autres objets.

Permettez-moi de corriger un concept ici. Beaucoup de gens pensent que Javascript n'est utilisé que dans les navigateurs. En fait, Javascript peut également être utilisé dans de nombreuses situations non Web. Il est rapporté que Javascript fonctionne bien dans certaines applications intégrées. champs. C'est aussi très bien. Bien sûr, je n'ai entendu que ces légendes.

Plus près de chez nous, lorsque nous écrivons : var i=1, nous déclarons en fait une variable dans la portée de la fenêtre.

Quand on écrit i=1, on déclare un attribut window.

 看这样一段代码:
  [code=javascript">
<script type="text/javascript">
var a = "hello";
b = "world";
Test();
function Test() 
{
alert(a + " " + b);
var a = "welcome";
b = "china";
alert(a + " " + b);
}
alert(a + " " + b);
</script>  
function runCode(id) {
obj = document.getElementById(id); 
var TestWin=open(&#39;&#39;); //打开一个窗口并赋给变量TestWin。 
TestWin.opener = null // 防止代码对论谈页面修改 
TestWin.document.write(obj.value); //向这个打开的窗口中写入代码code,这样就实现了运行代码功能。 
TestWin.document.close(); 
} 
var a = "hello";
b = "world";
Test();
function Test() 
{
alert(a + " " + b);
var a = "welcome";
b = "china";
alert(a + " " + b);
}
alert(a + " " + b);

Les résultats de sortie de ce code sont : monde indéfini, bienvenue en Chine, bonjour en Chine.

Expliquons-les séparément :

Dans ci-dessus, nous avons dit que lorsque Javascript est pré-compilé, toutes les variables var seront créées et la valeur par défaut n'est pas définie. Nous pouvons donner un exemple ici :

Nous pouvons écrire un morceau de code comme celui-ci :

<script type="text/javascript">
alert(a);
alert(b);
var a = "111";
        b = "111";
</script>  [/code]
    alert(a);  
    alert(b);  
    var a = "111";  
        b = "111";

Lorsque nous exécutons ce script, nous pouvons constater qu'undéfini apparaît en premier, puis une erreur de script s'affiche, indiquant que b n'existe pas. À partir de là, on peut montrer que a a été créé et initialisé à undefined pendant le processus de pré-compilation, mais que b ne peut être interprété que de manière séquentielle pendant l'exécution réelle. En fait, le code Javascript précompilé peut être presque compris comme suit :

<script type="text/javascript">
var a = undefined;
alert(a);
alert(b);
a = "111";
b = "111";
</script>

Ensuite, nous pouvons parler de la portée de la fonction Chaque fois que le code s'exécute dans une fonction, Javascript Le. Le moteur créera automatiquement une nouvelle portée, puis utilisera cette nouvelle portée comme portée enfant de la portée actuelle, puis basculera la portée de code actuelle vers cette nouvelle portée. Lorsque le code quitte la fonction, cette portée est détruite, renvoyant la portée du code à sa portée parent.

D'accord, les préparatifs sont presque terminés. Nous expliquerons ensuite la première question : demander pourquoi un monde indéfini sera généré.

Tout d'abord, le code est précompilé lors de la saisie de la méthode Test, une nouvelle portée est ouverte, puis la portée globale est utilisée comme portée parent. Ensuite, précompilez la méthode dans Test Comme le code ci-dessus, le corps de la méthode une fois la méthode Test précompilée est à peu près le suivant :

function Test() {
    var a = undefined;
    alert(a + " " + b);
    var a = "welcome";
    b = "china";
    alert(a + " " + b);
}


Bien sûr, cela ne peut pas être fait dans le portée actuelle Après avoir trouvé b, il ira à sa portée parent, c'est-à-dire la portée globale et trouvera b="world". Ce résultat a donc été produit.

Welcome china apparaît pour la deuxième fois, il n'y a rien à dire.

Pour la troisième fois, hello china apparaît. On peut comprendre que var a n'est qu'une variable locale de la méthode Test, et comme b n'est pas déclaré à l'avance, elle ira dans le scope parent pour trouver la définition correspondante.

Bon, examinons ensuite plusieurs variantes de cette méthode.

<script type="text/javascript">
var a = "hello";
        b = "world";
Test();
function Test() 
{
alert(a + " " + b);
a = "welcome";
b = "china";
alert(a + " " + b);
}
alert(a + " " + b);
</script>

Tout d'abord, nous changeons la var a dans le corps de la méthode en a. Analysons-la directement sans regarder la réponse. Tout d'abord, dans la phase de pré-compilation, il n'y a presque rien dans le corps de la méthode Change, donc à ce moment-là, a et b doivent aller dans leur scope parent pour le trouver, donc la première fois le résultat devrait être bonjour tout le monde, la deuxième fois il n'y a rien à dire : bienvenue. china, la troisième fois car a et b ne sont pas définis à l'avance dans cette portée, donc la valeur dans la portée parent est modifiée, alors bienvenue en Chine.

devrait être affiché Nous continuons :

<script type="text/javascript">
var a = "hello";
        b = "world";
Test();
function Test() 
{
alert(a + " " + b);
var a = "welcome";
var b = "china";
alert(a + " " + b);
}
alert(a + " " + b);
</script>
et ci-dessus L'analyse est la même, elle devrait produire un résultat indéfini, bienvenue en Chine, bonjour tout le monde.


<script type="text/javascript">
a = "hello";
b = "world";
Test();
function Test() 
{
alert(a + " " + b);
var a = "welcome";
b = "china";
alert(a + " " + b);
}
alert(a + " " + b);
</script>
devrait être indéfini en Chine, bienvenue en Chine, bonjour en Chine.


Après test, il n'y a aucun problème .

Par conséquent, nous pouvons conclure que lorsque chaque variable ne peut pas trouver sa propre définition, elle recherchera vers le haut le long de la chaîne d'action. De cette manière, des erreurs inattendues sont susceptibles de se produire, ajoutant beaucoup de difficultés au dépannage. . Ce qui est plus gênant, c'est que la valeur de la variable sur la portée parent peut également être modifiée, nous devrions donc essayer d'ajouter var lors de la déclaration de la variable, bien que Javascript ne nous oblige pas à le faire.


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