Heim  >  Artikel  >  Web-Frontend  >  Der Unterschied zwischen dem neuen Aufruf der js-Funktion und dem normalen Aufruf

Der Unterschied zwischen dem neuen Aufruf der js-Funktion und dem normalen Aufruf

一个新手
一个新手Original
2017-09-27 10:29:591308Durchsuche

Schauen Sie sich zunächst einen Codeabschnitt an, um die Rolle dieses Codes zu verstehen.

        place='out';                    
            function where(){
                    var place='in';
                    alert(place);         //in
                    alert(this.place);    //out
                    }

                    where();

Daraus ist ersichtlich, dass place die Variablen innerhalb der Funktion erhält, während this.place den externen Variablenwert erhält. Warum ist das so? Tatsächlich besteht die Aufgabe darin, auf das externe Umgebungsobjekt zu verweisen, das die aktuelle Funktion ausführt. Die Umgebung beim Ausführen von where hier ist die globale Umgebung, also zeigt dies auf global (Fenster im Browser), dann erhält this.place die globale Variable place.

Überprüfen Sie mit dem folgenden Code.

       place='out';
                    passer={                        var place: 'in',
                        askWhere: function(){
                            alert(this.place);   //in
                        },
                    };

                    passer.askWhere();

Dies hier ist in der Funktion, auf die askWhere zeigt. Die externe Umgebung für die Funktionsausführung ist das Passer-Objekt, also zeigt dies auf das Passer-Objekt, und was this.place bekommt, ist drin.

Schauen Sie sich dann den folgenden Codeabschnitt an. Welche Unterschiede werden dabei in der Funktion entstehen?

                    function Passer(){
                        this.place = 'in';                        this.askWhere = function(){
                            alert( this.place );    //in
                        }
                    }
                    alert(window.place);            //undefined
                    Tom = new Passer();
                    Tom.askWhere();

Wenn dies in Passer gemäß der vorherigen theoretischen Analyse auf global verweist, dann sollte this.place den Ort in der globalen Umgebung definieren. Warum tritt window.place = undefiniert auf?

Der Unterschied zwischen neuem Anruf und gewöhnlichem Anruf spiegelt sich hier wider. Tatsächlich werden während des neuen Vorgangs mehrere Schritte ausgeführt:

                1.创建一个新的对象(并把空对象的__proto__属性设置为Passer.prototype)。

                2.将构造函数的作用域赋给新对象(此时this 指向了这个新对象)。

                3.执行构造函数中的代码(通过this 为这个新对象添加属性)

                4.返回新对象。

Das hier deutet also nicht wirklich auf die globale Welt hin, sondern auf ein neues Objekt. Wenn dann askWhere ausgeführt wird, zeigt dies in der Funktion auch auf das Innere dieses neuen Objekts.

Wenn der Konstruktor Passer hier einen normalen Aufruf durchführt, stimmt das Ergebnis mit unserer ersten Analyse überein.

Zusammenfassung: Der grundlegende Grund für dieses Verhalten beim Aufruf von new für eine Funktion besteht darin, dass ein neues Objekt erstellt und der Gültigkeitsbereich des Konstruktors dem neuen Objekt zugewiesen wird, wodurch dieser auf das neue Objekt verweist . Tatsächlich hat sich die Rolle dieses Verweises auf das externe Umgebungsobjekt, das die aktuelle Funktion ausführt, nicht geändert.

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen dem neuen Aufruf der js-Funktion und dem normalen Aufruf. 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