2016-08-05 4 views
-3

Soweit ich das beurteilen kann, ist JS Funktionsbereich und nicht Blockbereich, was bedeutet, dass Objekte, die innerhalb (Klammer) deklariert sind, keinen anderen Ausführungskontext erzeugen. Allerdings:Warum können Sie nicht Funktionen aufrufen, die in Klammern angegeben sind?

$('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    first(); 
}); 

Returns Reference Error function is undefined. Die Funktion first wird innerhalb einer Klammer deklariert, daher sollte sie technisch für andere Funktionen verfügbar sein, die sie aus dem Geltungsbereich aufrufen, in dem sie deklariert wurde.

Aber das funktioniert:

var callDat = $('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    callDat.first(); 
}); 

Meine Vermutung ist, dass da Objekte sind Funktionen, eine Funktion innerhalb eines Objekts deklarieren kann innerhalb einer anderen Funktionsumfang auch ohne geschweifte Klammern als deklariert zählen. Ich wünsche mir dafür eine definitive Antwort.

+1

In 'function first() {' 'first' ist der Alias ​​erstellt, um die Funktion von sich selbst aufzurufen. 'first' ist von außerhalb von' first' nicht zugänglich. – Tushar

+1

Werfen Sie einen Blick auf [Entmystifizierte Namensausdrücke] (https://kangax.github.io/nfe/). Benannter Funktionsausdruck! == Funktionsdeklaration. Für das zweite Beispiel springen Sie zur völlig falschen Schlussfolgerung. –

+0

Mein Problem, das zweite Beispiel funktioniert nicht. Allerdings hatte ich diese Frage im Hinterkopf, bevor ich meine "Lösung" gefunden habe, also denke ich, dass sie nicht gelöscht werden sollte, obwohl sie vielleicht bearbeitet wurde, um nicht weitere Leser von meiner ursprünglichen Anfrage abzulenken? –

Antwort

5

In Ihrem zweiten Beispiel ist das first, das Sie bekommen, nicht das, das Sie oben deklariert haben - es ist die jQuery.first Methode, die für alle jQuery-Objekte verfügbar ist.

Dies ist prüfbar - klicken Sie auf "First" und dann "Second" unten gibt nicht "zuerst aktiviert" von einem Klick auf die zweite Schaltfläche.

var callDat = $('#firstBtn').click(function first() { 
 
    console.log("first activated"); 
 
}); 
 

 
$('#secondBtn').click(function() { 
 
    console.log("second activated"); 
 
    callDat.first(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="firstBtn">First</button> 
 

 
<button id="secondBtn">Second</button>

4

Returns Referenzfehler Funktion nicht definiert ist. Die Funktion wird zuerst innerhalb einer Klammer deklariert, daher sollte sie technisch für andere Funktionen verfügbar sein, die sie aus dem Geltungsbereich aufrufen, in dem sie deklariert wurde.

Nein. Funktionsdeklarationen erstellen eine Variable in dem Geltungsbereich, für den sie deklariert sind und der denselben Namen wie die Funktion hat. Funktionsausdrücke nicht, auch wenn sie mit dem Namen Funktionsausdrücke sind. (Benannte Funktionsausdrücke, um eine Variable dieses Namens innerhalb ihres eigenen Bereichs zu erstellen).

Weiterführende Literatur: JavaScript function declaration syntax: var fn = function() {} vs function fn() {}

Meine Vermutung ist, dass da Objekte Funktionen,

Funktionen Objekte sind. Das Gegenteil ist nicht unbedingt wahr.

eine Funktion innerhalb eines Objekts deklarieren zählen kann als in einem unterschiedlichen Funktionsumfang auch ohne geschweifte Klammern erklärt

Nein, es kann nicht.

+0

Ich habe diesen Artikel gelesen und ich verstehe das etwas. Du antwortest mein zweites Beispiel - aber was ist mit dem ersten? Beide sind erklärte Funktionen. –

+3

@BarAkiva - Weder sind Funktionsdeklarationen. Sie haben nur Funktionsausdrücke. – Quentin

0

Es ist ein "Funktionsliteral" oder "Funktionsausdruck", das nur eine Funktion als Wert zurückgibt, aber es in dem umgebenden Funktionsumfang nicht als eine Variable definiert. Es hat jedoch seinen eigenen Umfang.Sehen Sie meinen Snippet unten für etwas sehr interessant:

var counter = 0; 
 

 
// function "b" is acting as a value to be given to "a" 
 
var a = function b() { 
 

 
    alert(counter); 
 

 
    counter++; 
 

 
    // both "b" and "a" are accessible in here 
 
    if(counter < 3) b(); 
 

 
}; 
 

 
a(); // only a is accessible here

Weil es von der Syntax nicht offensichtlich ist, die Form ...

function func() { ... } 

... durch die ersetzt werden kann, folgende um klarer zu sein:

var func = function() { ... }; 
1

In der ersten exa mple Sie tatsächlich erstelle einen Rahmen - dieses:

$('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

ist eigentlich diese:

(function first() { 
    console.log("first activated"); 
}) 

Und als solche ist nicht für andere Bereiche

jetzt - wenn Sie‘ Ich erkläre es so:

function first() { 
    console.log("first activated"); 
} 

$('#firstBtn').click(first); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    first(); 
}); 

Sie erhalten den Fehler nicht

Verwandte Themen