2017-05-31 9 views
0

Javascript unterstützt First-Class-Funktionen, in diesem Fall können wir die Funktion als Argument übergeben. Eine anonyme Funktion, die in einer Argumentliste einer anderen Funktion definiert ist, was ist die lexikalische Umgebung (d. H. Geltungsbereich) dieser anonymen Funktion?Was ist die lexikalische Umgebung eines Funktionsarguments?

zum Beispiel:

var m = 2; 

(function(p1,p2){ 
    p2(p1); 
})(true, function(p1){ // an anonymous function passed as an argument. 
    m = 3; 
    if(p1){...} 
}); // the end of self-invoked function expression. 
+0

wahrscheinlich ist es '{p1: true, m: 3}'? –

+0

Die Funktion hätte Zugriff auf den Bereich, in dem sie definiert wurde, und schließt einen übergeordneten Bereich ein (z. B. global/window). Wenn es in einer anderen Funktion definiert ist, hat es Zugriff auf alle Variablen, die in dieser Funktion definiert sind. Wenn es als Argument wie ein Callback übergeben wird, hat es keinen Zugriff auf Variablen, die in der Funktion definiert sind, in die es übergeben wurde, weil es außerhalb dieser Funktion definiert und als Argument übergeben wurde. –

+0

IslamI bakaev Sorry hat es nicht verstanden. Jonathan Kuhn Also ist die Frage ..., soll ich die in der Argumentliste definierte anonyme Funktion als eine in einer anderen Funktion definierte Funktion betrachten? –

Antwort

1

Die Funktion Zugriff auf den Umfang haben würde, wo es definiert wurde, und umfasst jeden geordneten Bereich (z.B. global/Fenster). Wenn es in einer anderen Funktion definiert ist, hat es Zugriff auf alle Variablen, die in dieser Funktion definiert sind. Wenn es als Argument wie ein Callback übergeben wird, hat es keinen Zugriff auf Variablen, die in der Funktion definiert sind, in die es übergeben wurde, weil es außerhalb dieser Funktion definiert und als Argument übergeben wurde.

Beispiel:

var a = 1; 

(function(callback){ //func1 
    //access variable in parent scope 
    console.log('func1', a); //outputs 1 

    //define a new variable within this function's scope 
    var b = 2; 

    //call our callback 
    callback(); 

    //define and call a function within this function's scope 
    (function(){ //func3 
     //access variable in parent scope 
     console.log('func3', a); //outputs 1 
     //access variable in parent function scope 
     console.log('func3', b); //outputs 2 
    })(); 

})(function(){ //func2 
    //access variable in parent scope 
    console.log('func2', a); //outputs 1 
    //access variable from invoking function 
    console.log('func2', b); //outputs undefined 
}); 

Dies würde die Ausgabe so etwas wie:

func1 1 
func2 1 
func2 undefined 
func3 1 
func3 2 

Wo alle Funktionen Variable a sehen können, weil sie in einem übergeordneten Bereich auf alle Funktionen ist. Die Argumentfunktion kann die Variable b nicht sehen, da b in einer anderen Funktion definiert ist und die Argumentfunktion außerhalb definiert und als Argument übergeben wurde. Und die in der ersten Funktion definierte Funktion kann sowohl a als auch b sehen.

0

Das Aufrufen eines IIFE ist effektiv das Gleiche, als würde man zuerst die Funktion einer Variablen zuweisen und dann die Funktion durch diese Variable aufrufen; Wie bei jeder anderen Verwendung von anonymen Funktionen ist es nur eine Abkürzung, die vermeidet, der Funktion einen Namen zu geben. Also:

(function(p1,p2){ 
    p2(p1); 
})(true, function(p1){ // an anonymous function passed as an argument. 
    m = 3; 
    if(p1){...} 
}); 

entspricht:

var temp = function(p1,p2){ 
    p2(p1); 
}; 
temp(true, function(p1) { 
    m = 3; 
    if(p1){...} 
}); 

mit Ausnahme der Zugabe von temp zu dem äußeren Umfang; Da diese Variable nirgendwo anders erscheint, hat sie keine Auswirkungen. Die Bereiche aller anderen Variablen sind in beiden Szenarien identisch.

1

Wenn Sie unsicher sind, was die Bereiche einer Funktion in der Argumentliste eines Anrufs definiert ist, feststellen, dass

fn(function x(…) { … }) 

äquivalent zu

_temp = function x(…) { … }; 
fn(_temp) 

Argumente ausgewertet werden vor dem eigentlichen Rufen Sie an, und sie werden in dem gleichen Bereich ausgewertet, in dem der Aufruf selbst ausgewertet wird.

Verwandte Themen