Heim >Web-Frontend >js-Tutorial >Analysieren von Fragen zum JavaScript-Umfang

Analysieren von Fragen zum JavaScript-Umfang

怪我咯
怪我咯Original
2017-05-07 11:46:39974Durchsuche

Jeder, der ein Programm geschrieben hat, wird mit dem Konzept des Umfangs vertraut sein. In diesem Artikel sprechen wir über den Umfang von Javascript.

In Javascript ist die globale Umgebung selbst ein Objekt. Im Browser-Host ist dieses Objekt ein Fenster, aber wenn Javascript in anderen Nicht-Browser-Hosts verwendet wird, z. B. in eingebetteten Umgebungen, kann es sich um andere Objekte handeln.

Lassen Sie mich hier ein Konzept korrigieren. Tatsächlich kann Javascript auch in vielen Nicht-Web-Situationen verwendet werden -basierte Anwendungsfelder. Natürlich habe ich nur diese Legenden gehört.

Genauer gesagt: Wenn wir schreiben: var i=1, deklarieren wir tatsächlich eine Variable im Fensterbereich.

Wenn wir i=1 schreiben, deklarieren wir ein Fensterattribut.

 看这样一段代码:
  [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);

Die Ausgabeergebnisse dieses Codes sind: undefinierte Welt, Willkommen China, Hallo China.

Lassen Sie uns sie separat erklären:

In Oben haben wir gesagt, dass bei der Vorkompilierung von Javascript alle var-Variablen erstellt werden und der Standardwert undefiniert ist. Wir können hier ein Beispiel geben:

Wir können einen Code wie diesen schreiben:

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

Wenn wir dieses Skript ausführen, stellen wir möglicherweise fest, dass zuerst undefiniert angezeigt wird, und dann wird ein Skriptfehler angezeigt, der darauf hinweist, dass b nicht vorhanden ist. Es kann gezeigt werden, dass a während des Vorkompilierungsprozesses erstellt und auf undefiniert initialisiert wurde, b jedoch nur während der tatsächlichen Laufzeit sequentiell interpretiert werden kann. Tatsächlich kann der vorkompilierte Javascript-Code fast wie folgt verstanden werden:

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

Als nächstes können wir über den Umfang der Funktion sprechen, wann immer der Code auf eine Funktion stößt Die Engine erstellt automatisch einen neuen Bereich, verwendet diesen neuen Bereich dann als untergeordneten Bereich des aktuellen Bereichs und wechselt dann den aktuellen Codebereich zu diesem neuen Bereich. Wenn der Code die Funktion verlässt, wird dieser Bereich zerstört und der Codebereich in seinen übergeordneten Bereich zurückversetzt.

Okay, die Vorbereitungen sind fast abgeschlossen. Als nächstes erklären wir die erste Frage: Warum wird die undefinierte Welt ausgegeben?

Zuerst wird der Code vorkompiliert. Bei der Eingabe der Testmethode wird ein neuer Bereich geöffnet und dann der globale Bereich als übergeordneter Bereich verwendet. Kompilieren Sie dann die Methode in Test vor. Wie im obigen Code sieht der Methodenkörper nach der Vorkompilierung der Testmethode ungefähr wie folgt aus:

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


Natürlich ist dies nicht möglich aktueller Bereich Nachdem er b gefunden hat, geht er zu seinem übergeordneten Bereich, also dem globalen Bereich, und findet b="world". So entstand dieses Ergebnis.

Welcome China taucht zum zweiten Mal auf, es gibt nichts zu sagen.

Zum dritten Mal erscheint „hello china“. Wir können verstehen, dass var a nur eine lokale Variable der Methode Test ist. Da b nicht im Voraus deklariert wird, wird sie zum übergeordneten Bereich weitergeleitet, um die entsprechende Definition zu finden.

Okay, als nächstes werfen wir einen Blick auf verschiedene Variationen dieser Methode.

<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>

Zuerst ändern wir die Variable a im Methodenkörper in a. Zunächst analysieren wir sie in der Vorkompilierungsphase. Da sich im Methodenkörper fast nichts ändert, müssen a und b zu diesem Zeitpunkt zu ihrem übergeordneten Bereich gehen, um sie zu finden. Beim ersten Mal sollte das Ergebnis „Hallo Welt“ lauten, beim zweiten Mal gibt es nichts zu sagen: Willkommen China, das dritte Mal, da a und b in diesem Bereich nicht im Voraus definiert sind, sodass der Wert im übergeordneten Bereich geändert wird. Willkommen in China.

sollte ausgegeben werden:

<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>

und höher Die Analyse ist die gleiche, sie sollte undefiniert undefiniert, willkommen China, hallo Welt, ausgeben.

<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>

sollte undefiniertes China, willkommen China, hallo China sein.

Nach dem Test gibt es kein Problem.

Daher können wir daraus schließen, dass jede Variable, wenn sie ihre eigene Definition nicht finden kann, entlang der Aktionskette nach oben sucht, was wahrscheinlich zu unerwarteten Fehlern führt, was die Fehlerbehebung erheblich erschwert. Noch problematischer ist, dass auch der Variablenwert im übergeordneten Bereich geändert werden kann. Daher sollten wir versuchen, beim Deklarieren der Variablen var hinzuzufügen, obwohl Javascript uns nicht dazu zwingt.


Das obige ist der detaillierte Inhalt vonAnalysieren von Fragen zum JavaScript-Umfang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn