Heim Web-Frontend js-Tutorial JS Core Series: Eine kurze Diskussion zum Funktionsumfang

JS Core Series: Eine kurze Diskussion zum Funktionsumfang

Jan 24, 2017 am 11:34 AM
js 作用域 函数

1. Geltungsbereich

Der sogenannte Geltungsbereich ist: Variablen werden im Funktionskörper definiert, in dem sie deklariert sind, und in jedem Funktionskörper, in dem dieser Funktionskörper verschachtelt ist.

function scope(){
    var foo = "global";
    if(window.getComputedStyle){
        var a = "I'm if";
        console.log("if:"+foo); //if:global
    }
    while(1){
        var b = "I'm while";
        console.log("while:"+foo);//while:global
        break;
    }
    !function (){
        var c = "I'm function";
        console.log("function:"+foo);//function:global
    }();
    console.log(
         foo,//global
         a, // I'm if
         b, // I'm while
         c  // c is not defined
    );
}
scope();
Nach dem Login kopieren

(1) Auf die in der Scope-Funktion definierte Variable foo kann nicht nur allein zugegriffen werden, sondern auch in if-Anweisungen, while-Anweisungen und eingebetteten anonymen Funktionen. Daher ist der Gültigkeitsbereich von foo der Funktionskörper des Gültigkeitsbereichs.

(2) In JavaScript können if, while, for und andere Codeblöcke keine unabhängigen Bereiche bilden. Daher gibt es in JavaScript keinen Bereich auf Blockebene, sondern nur einen Funktionsbereich.

Allerdings gibt es in JS einen Sonderfall:

Wenn eine Variable nicht mit var deklariert wird, hat window dieses Attribut, also Der Gültigkeitsbereich dieser Variablen gehört nicht zu einem bestimmten Funktionskörper, sondern zum Fensterobjekt.

function varscope(){
    foo = "I'm in function";
    console.log(foo);//I'm in function
}
varscope();
console.log(window.foo); //I'm in function
Nach dem Login kopieren

2. Scope Chain (Scope Chain)

Die sogenannte Scope Chain ist: Es gibt mehrere Schichten von Funktionskörpern, die in einem Funktionskörper verschachtelt sind, und dieselbe Variable ist in verschiedenen Funktionskörpern definiert. Wenn eine der Funktionen auf diese Variable zugreift, wird eine Bereichskette gebildet. Wenn

foo = "window";
function first(){
    var foo = "first";
    function second(){
       var foo = "second";
       console.log(foo);
    }
    function third(){
       console.log(foo);
    }
    second(); //second
    third();  //first
}
first();
Nach dem Login kopieren

ond, platziert die JS-Engine den Bereich „Second“ an der Spitze der verknüpften Liste, gefolgt vom Bereich „First“ und schließlich dem Fensterobjekt, sodass die folgende Bereichskette gebildet wird :

second->first->window, zu diesem Zeitpunkt sucht die JS-Engine nach der Variablen foo entlang der Bereichskette, und was gefunden wird, ist „second“

Wenn drittes ausgeführt wird, wird der durch die dritte Kette gebildete Bereich: Third->first->window, also wird Folgendes gefunden: „frist“

Sonderfall: mit Anweisung

Die with-Anweisung in JS wird hauptsächlich verwendet, um die Bereichskette vorübergehend zu erweitern und die Objekte in der Anweisung zum Kopf des Bereichs hinzuzufügen. Nach Beendigung der with-Anweisung kehrt die Gültigkeitsbereichskette zum Normalzustand zurück.

foo = "window";
function first(){
    var foo = "first";
    function second(){
       var foo = "second";
       console.log(foo);
    }
    function third(obj){
       console.log(foo); //first
       with (obj){
           console.log(foo); //obj
       }
       console.log(foo); //first
    }
    var obj = {foo:'obj'};
    third(obj);
}
first();
Nach dem Login kopieren

Beim Ausführen von Third() wird ein obj-Objekt übergeben, und obj hat das Attribut foo. Beim Ausführen der with-Anweisung platziert die JS-Engine obj an der Spitze der ursprünglichen verknüpften Liste und bildet so Die Gültigkeitsbereichskette lautet wie folgt:

obj->third->first->window Das zu diesem Zeitpunkt gefundene foo ist das foo in obj, daher lautet die Ausgabe: „obj“ vor with Anschließend wird die Suche entlang der ursprünglichen verknüpften Liste durchgeführt. Dies zeigt, dass die Bereichskette nach Beendigung der with-Anweisung wieder normal ist.

3. Dieses Schlüsselwort

In einer Funktion ist dies immer der Fall zeigt auf das Eigentümerobjekt der aktuellen Funktion dies kann nur seinen spezifischen Zeiger und sein aufrufendes Objekt zur Laufzeit ermitteln.

Dieser Satz fasst alles zusammen: Merken, Merken, Merken! (Ps: Sagen Sie wichtige Dinge dreimal!)

window.name = "window";
function f(){
    console.log(this.name);
}
f();//window

var obj = {name:'obj'};
f.call(obj); //obj
Nach dem Login kopieren

Wenn f() ausgeführt wird, ist der Aufrufer von f() das Fensterobjekt. Die Ausgabe von „window“

f.call(obj) bedeutet also, dass f() in das Objekt ausgeführt wird Objekt, das zu obj.f() entspricht. Zu diesem Zeitpunkt ist dies in f obj, daher ist die Ausgabe „obj“

4. Tatsächlich Kampfanwendung

Code1:

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        return function(){
            return this.foo;
        };
    }
};
var f = obj.getFoo();
f(); //window
Nach dem Login kopieren

Code2:

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        var that = this;
        return function(){
            return that.foo;
        };
    }
};
var f = obj.getFoo();
f(); //obj
Nach dem Login kopieren

Code1 und Code2 sind hierfür am besten geeignet und Umfang Gute Zusammenfassung Wenn Sie Zweifel an den Laufergebnissen haben, können Sie diese gerne besprechen!

Code-Analyse:

code1:
执行var  f = obj.getFoo()返回的是一个匿名函数,相当于:
var f = function(){
     return this.foo;
}
f() 相当于window.f(), 因此f中的this指向的是window对象,this.foo相当于window.foo, 所以f()返回"window" 

code2:
执行var f = obj.getFoo() 同样返回匿名函数,即:
var f = function(){
     return that.foo;
}
唯一不同的是f中的this变成了that, 要知道that是哪个对象之前,先确定f的作用域链:f->getFoo->window 并在该链条上查找that,此时可以发现that指代的是getFoo中的this, getFoo中的this指向其运行时的调用者,从var f = obj.getFoo() 可知此时this指向的是obj对象,因此that.foo 就相当于obj.foo,所以f()返回"obj"
Nach dem Login kopieren


Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwendung der Typedef-Struktur in der C-Sprache Verwendung der Typedef-Struktur in der C-Sprache May 09, 2024 am 10:15 AM

typedef struct wird in der C-Sprache zum Erstellen von Strukturtypaliasen verwendet, um die Verwendung von Strukturen zu vereinfachen. Es weist einem neuen Datentyp ein Alias ​​auf eine vorhandene Struktur zu, indem es den Strukturalias angibt. Zu den Vorteilen gehören verbesserte Lesbarkeit, Wiederverwendung von Code und Typprüfung. Hinweis: Die Struktur muss vor der Verwendung eines Alias ​​definiert werden. Der Alias ​​muss im Programm eindeutig sein und nur innerhalb des Bereichs gültig sein, in dem er deklariert ist.

So lösen Sie die in Java erwartete Variable So lösen Sie die in Java erwartete Variable May 07, 2024 am 02:48 AM

Variablenerwartungsausnahmen in Java können gelöst werden durch: Initialisierung von Variablen; Verwendung von Nullwerten; Verwendung von Überprüfungen und Zuweisungen;

Vor- und Nachteile von Verschlüssen in js Vor- und Nachteile von Verschlüssen in js May 10, 2024 am 04:39 AM

Zu den Vorteilen von JavaScript-Abschlüssen gehören die Aufrechterhaltung des variablen Bereichs, die Aktivierung von modularem Code, die verzögerte Ausführung und die Ereignisbehandlung. Zu den Nachteilen zählen Speicherverluste, erhöhte Komplexität, Leistungsaufwand und Auswirkungen der Bereichskette.

Was bedeutet include in c++? Was bedeutet include in c++? May 09, 2024 am 01:45 AM

Die Präprozessoranweisung #include in C++ fügt den Inhalt einer externen Quelldatei in die aktuelle Quelldatei ein und kopiert ihren Inhalt an die entsprechende Stelle in der aktuellen Quelldatei. Wird hauptsächlich zum Einschließen von Header-Dateien verwendet, die im Code benötigte Deklarationen enthalten, z. B. #include <iostream>, um Standard-Eingabe-/Ausgabefunktionen einzubinden.

C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus May 09, 2024 am 11:06 AM

Lebenszyklus von C++-Smartpointern: Erstellung: Smartpointer werden erstellt, wenn Speicher zugewiesen wird. Eigentumsübertragung: Übertragen Sie das Eigentum durch einen Umzugsvorgang. Freigabe: Speicher wird freigegeben, wenn ein Smart Pointer den Gültigkeitsbereich verlässt oder explizit freigegeben wird. Objektzerstörung: Wenn das Objekt, auf das gezeigt wird, zerstört wird, wird der intelligente Zeiger zu einem ungültigen Zeiger.

Können die Definition und der Aufruf von Funktionen in C++ verschachtelt werden? Können die Definition und der Aufruf von Funktionen in C++ verschachtelt werden? May 06, 2024 pm 06:36 PM

Dürfen. C++ erlaubt verschachtelte Funktionsdefinitionen und Aufrufe. Externe Funktionen können integrierte Funktionen definieren und interne Funktionen können direkt innerhalb des Bereichs aufgerufen werden. Verschachtelte Funktionen verbessern die Kapselung, Wiederverwendbarkeit und Bereichskontrolle. Interne Funktionen können jedoch nicht direkt auf lokale Variablen externer Funktionen zugreifen, und der Rückgabewerttyp muss mit der Deklaration der externen Funktion übereinstimmen. Interne Funktionen können nicht selbstrekursiv sein.

Vollständige Sammlung von Excel-Funktionsformeln Vollständige Sammlung von Excel-Funktionsformeln May 07, 2024 pm 12:04 PM

1. Die SUMME-Funktion wird verwendet, um die Zahlen in einer Spalte oder einer Gruppe von Zellen zu summieren, zum Beispiel: =SUMME(A1:J10). 2. Die Funktion AVERAGE wird verwendet, um den Durchschnitt der Zahlen in einer Spalte oder einer Gruppe von Zellen zu berechnen, zum Beispiel: =AVERAGE(A1:A10). 3. COUNT-Funktion, die verwendet wird, um die Anzahl der Zahlen oder Texte in einer Spalte oder einer Gruppe von Zellen zu zählen, zum Beispiel: =COUNT(A1:A10) 4. IF-Funktion, die verwendet wird, um logische Urteile auf der Grundlage spezifizierter Bedingungen zu treffen und die zurückzugeben entsprechendes Ergebnis.

Es gibt mehrere Situationen, auf die dies in js hinweist Es gibt mehrere Situationen, auf die dies in js hinweist May 06, 2024 pm 02:03 PM

Zu den Zeigertypen gehören in JavaScript: 1. Globales Objekt; 3. Konstruktoraufruf; 5. Pfeilfunktion (erbt dies); Darüber hinaus können Sie mit den Methoden bind(), call() und apply() explizit festlegen, worauf dies hinweist.

See all articles