Heim  >  Artikel  >  Web-Frontend  >  Zusammenfassung von Beispielen für Funktionsaufrufmuster in grundlegenden Javascript-Tutorials

Zusammenfassung von Beispielen für Funktionsaufrufmuster in grundlegenden Javascript-Tutorials

伊谢尔伦
伊谢尔伦Original
2017-07-25 10:27:251173Durchsuche

Die Funktion wird nur ausgeführt, wenn sie aufgerufen wird. Der Aufrufoperator ist ein Klammerpaar, das auf einen beliebigen Ausdruck folgt, der einen Funktionswert erzeugt. Die Klammern können null oder mehr durch Kommas getrennte Ausdrücke enthalten. Jeder Ausdruck erzeugt einen Parameterwert und jedem Parameterwert wird der formale Parametername

zugewiesen, der bei der Deklaration der Funktion definiert wurde. JavaScript verfügt über insgesamt 4 Aufrufmodi: Funktionsaufrufmodus, Methodenaufrufmodus, Konstruktoraufrufmodus und indirekter Aufrufmodus

【1】Funktionsaufrufmodus

Wenn eine Funktion keine Eigenschaft eines Objekts ist, wird sie als Funktion aufgerufen. Bei gewöhnlichen Funktionsaufrufen ist der Rückgabewert der Funktion der Wert des aufrufenden Ausdrucks

function add(x,y){    
   return x+y;
}
var sum = add(3,4);
console.log(sum)//7

Beim Aufruf einer Funktion im Funktionsaufrufmodus ist diese im nicht-strikten Modus an das globale Objekt gebunden ; im strikten Modus ist dies undefiniert

function add(x,y){
    console.log(this);//window}    
add();
function add(x,y){    
'use strict';
    console.log(this);//undefined
}    
add();//window

Daher kann „this“ verwendet werden, um zu bestimmen, ob der aktuelle Modus strikt ist

var strict = (function(){return !this;}());

umschreiben

weil Dies in der Funktion im Funktionsaufrufmodus an das globale Objekt gebunden ist, sodass globale Eigenschaften überschrieben werden

var a = 0;
function fn(){
    this.a = 1;
}
fn();
console.log(this,this.a,a);//window 1 1

【2】Methodenaufrufmodus

Wenn eine Funktion wird gespeichert. Wenn es sich um eine Eigenschaft eines Objekts handelt, nennen wir es eine Methode. Beim Aufruf einer Methode wird diese an das Objekt gebunden. Wenn der aufrufende Ausdruck eine Aktion zum Extrahieren von Attributen enthält, wird er als Methode aufgerufen.

var o = {
    m: function(){
        console.log(1);
    }
};
o.m();//1

Die Methode kann damit auf das Objekt zugreifen, zu dem sie gehört, und so den Wert vom Objekt abrufen oder das Objekt ändern. Die Bindung dieser an das Objekt erfolgt zum Zeitpunkt des Aufrufs. Methoden, die auf diese Weise den Kontext der Objekte erhalten können, zu denen sie gehören, werden öffentliche Methoden genannt

var o = {
    a: 1,
    m: function(){
        return this;
    },
    n: function(){
        this.a = 2;
    }
};
console.log(o.m().a);//1
o.n();
console.log(o.m().a);//2

Jede Funktion, die als Methode aufgerufen wird, übergibt tatsächlich einen impliziten tatsächlichen Parameter – dieser tatsächliche Parameter ist ein Objekt , Das übergeordnete Element des Methodenaufrufs ist dieses Objekt. Im Allgemeinen können Methoden, die auf diesem Objekt basieren, verschiedene Operationen ausführen. Die Syntax des Methodenaufrufs hat deutlich gezeigt, dass die Funktion auf einem Objekt basiert

rect.setSize(width,height);
setRectSize(rect,width,height);

Annahme Die beiden oben genannten Codezeilen haben genau die gleiche Funktion. Sie arbeiten beide mit einem hypothetischen Objekt rect. Wie Sie sehen können, zeigt die Methodenaufrufsyntax in der ersten Zeile deutlich an, dass der Träger dieser Funktionsausführung das Rect-Objekt ist und alle Operationen in der Funktion auf diesem Objekt basieren

Im Gegensatz zu Variablen ist das Schlüsselwort Dies hat keinen Gültigkeitsbereich. Aufgrund der Einschränkung erbt eine verschachtelte Funktion dies nicht von der Funktion, die sie aufruft. Wenn eine verschachtelte Funktion als Methode aufgerufen wird, zeigt ihr Wert auf das Objekt, das sie aufgerufen hat. Wenn die verschachtelte Funktion als Funktion aufgerufen wird, ist dieser Wert entweder ein globales Objekt (im nicht-strikten Modus) oder undefiniert (im strikten Modus)

var o = {
    m: function(){
         function n(){
             return this;
         }
         return n();
    }
}
console.log(o.m());//window
var o = {
    m: function(){
         function n(){
             'use strict';
             return this;
         }
         return n();
    }
}
console.log(o.m());//undefined

Wenn Sie auf die zugreifen möchten Wenn Sie diesen Wert dieser externen Funktion verwenden möchten, müssen Sie den Wert dieser Variable in einer Variablen speichern. Diese Variable und die interne Funktion befinden sich beide im selben Bereich. Normalerweise wird die Variable self oder that verwendet, um dies zu speichern

var o = {
    m: function(){
        var self = this;
        console.log(this === o);//true
         function n(){
             console.log(this === o);//false
             console.log(self === o);//true
             return self;
         }
         return n();
    }
}
console.log(o.m() === o);//true

【3】Konstruktoraufrufmodus

Wenn einem Funktions- oder Methodenaufruf das Schlüsselwort new vorangestellt ist, handelt es sich um einen Konstruktoraufruf

function fn(){    
   this.a = 1;
};
var obj = new fn();
console.log(obj.a);//1

Wenn der Konstruktoraufruf eine Reihe von Argumentlisten in Klammern enthält, werden diese Argumentausdrücke zuerst ausgewertet und dann an die Funktion übergeben

function fn(x){    
  this.a = x;
};
var obj = new fn(2);
console.log(obj.a);//2

Wenn der Konstruktor keine Formularparameter hat , erlaubt die Syntax des JavaScript-Konstruktoraufrufs das Weglassen der tatsächlichen Parameterliste und Klammern. Bei jedem Konstruktoraufruf ohne formale Parameter können die Klammern weggelassen werden

var o = new Object();//等价于
var o = new Object;

[Hinweis] Obwohl der Konstruktor wie ein Methodenaufruf aussieht, verwendet er dennoch das neue Objekt als aufrufenden Kontext. Das heißt, im Ausdruck new o.m() ist der Aufrufkontext nicht o

var o = {
    m: function(){
        return this;
    }
}
var obj = new o.m();
console.log(obj,obj === o);//{} false
console.log(obj.constructor === o.m);//true

Konstruktoren verwenden normalerweise nicht das Schlüsselwort return. Sie initialisieren normalerweise neue Objekte im Funktionskörper des Konstruktors ausgeführt wird, wird es explizit zurückgegeben. In diesem Fall ergibt der Konstruktoraufrufausdruck den Wert dieses neuen Objekts

function fn(){    
  this.a = 2;
}var test = new fn();
console.log(test);//{a:2}

Wenn der Konstruktor eine Rückgabeanweisung verwendet, aber keinen Rückgabewert angibt oder einen primitiven Wert zurückgibt, dann Der Rückgabewert wird ignoriert und dieses neue Objekt wird als Aufrufergebnis verwendet

function fn(){
    this.a = 2;
    return;
}
var test = new fn();
console.log(test);//{a:2}

Wenn der Konstruktor explizit die Return-Anweisung verwendet, um ein Objekt zurückzugeben, dann ist der Wert des aufrufenden Ausdrucks dieses Objekt

var obj = {a:1};
function fn(){
    this.a = 2;
    return obj;
}
var test = new fn();
console.log(test);//{a:1}

【4】Indirekter Aufrufmodus

Funktionen in JavaScript sind ebenfalls Objekte, und Funktionsobjekte können auch Methoden enthalten. Mit den Methoden call() und apply() können Funktionen indirekt aufgerufen werden

Beide Methoden ermöglichen die explizite Angabe des für den Aufruf erforderlichen Wertes, d. h. jede Funktion kann als Methode einer beliebigen Funktion verwendet werden Wird aufgerufen, auch wenn diese Funktion keine Methode dieses Objekts ist. Beide Methoden können die tatsächlichen Parameter des Aufrufs angeben. Die Methode call() verwendet ihre eigene Liste tatsächlicher Parameter als tatsächliche Parameter der Funktion, und die Methode apply() erfordert die Übergabe der Parameter in Form eines Arrays

var obj = {};
function sum(x,y){
    return x+y;
}
console.log(sum.call(obj,1,2));//3
console.log(sum.apply(obj,[1,2]));//3

Das obige ist der detaillierte Inhalt vonZusammenfassung von Beispielen für Funktionsaufrufmuster in grundlegenden Javascript-Tutorials. 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