2016-07-04 8 views
-1

Ich habe diese Funktion oft benutzen: in $.each(Ojbect, function), sollte die Funktion für zwei Argumente erwarten:Warum funktioniert es, wenn ich eine No-Param-Funktion als Callback übergeben, die Argumente erwartet?

function (index, value) {...} 

(pro jQuery API Dokument: enter link description here). Die meiste Zeit definiere ich meine Nicht-Arg-Funktion. Zum Beispiel, um nur den Wert auszugeben.

$.each([1,2,3], function(){ 
    console.log($(this); 
}); 

Also die $ .Each akzeptiert meine No-Arg-Funktion. Dies ist sehr praktisch im täglichen Gebrauch. Aber ich habe kein offizielles Dokument gefunden, das besagt, dass das OK ist. Nur um sicher zu sein, warum so etwas funktioniert?

+1

Beachten Sie, dass jQuery dafür sorgt, dass "this" auf jedes Element im Array verweist. Wenn Sie das native '.forEach()' auf dem Array-Prototyp verwenden, tut es dies * nicht, so dass Ihr Callback nicht funktioniert. – Pointy

Antwort

2

So funktionieren JavaScript-Funktionsaufrufe. Die Anzahl der Argumente, die an eine Funktion übergeben werden, muss nicht mit der Anzahl der Parameter in der Definition dieser Funktion übereinstimmen. Wenn es weniger Parameter als Argumente gibt (wie in Ihrem Beispiel), sind die Argumente weiterhin innerhalb der Funktion durch das array-artige Array-Objekt zugänglich. Wenn es mehr Parameter als Argumente sind, werden die Variablen ohne passende Argumente undefined sein:

[ 
function(){ console.log(arguments); },  // ['foo', 'bar'] 
function(x){ console.log(x, arguments); }, // 'foo' ['foo', 'bar'] 
function(x,y){ console.log(x, y); },  // 'foo' 'bar' 
function(x,y,z){ console.log(x, y, z); }, // 'foo' 'bar' undefined 
]. 

// Call each function with two arguments: 'foo' and 'bar' 
forEach(func => func('foo', 'bar')); 
0

Die Callback-Argumente sind optional, ob Sie sie festlegen oder nicht vollständig hängt von Ihren Bedürfnissen ab. Wenn Sie in Ihrem Callback-Bereich darauf zugreifen müssen, sollten sie da sein. In Ihrem console.log-Beispiel ist es in Ordnung, die Argumente zu verlassen. Dies führt zu einem Code, der kürzer und einfacher zu lesen ist (da keine unbenutzten Variablen darin enthalten sind)

0

In Javascript müssen Parameter nur definiert werden, wenn sie in einer Funktion verwendet werden. Wenn sie nicht verwendet werden, empfiehlt die Best Practice, dass sie nicht definiert werden (in der Tat melden Javascript-Analysetools wie jshint und jslint einen Fehler, wenn Parameter definiert, aber nicht verwendet werden).

Also, als Antwort auf Ihre Frage, ist es völlig in Ordnung, Ihre Funktion so zu definieren, wie Sie haben.

2

Javascript dynamische Sprache ist mit Funktionen Bürger erster Klasse sein. Auch Funktionsparameter sind sozusagen Aliasnamen für positionierte Elemente von array-artigem Objekt arguments.

Vorausgesetzt, dass Sie Funktion mit 0 Argumente und immer noch sehen, Werte von Parametern übergeben, um es definieren:

(function() { console.log(arguments) })('a',1,null, 'hey') 

>outputs: ["a", 1, null, "hey"] 

Da js ist dynamische Sprache, gibt es keine Möglichkeit für VM es Funktionsargumente Typen oder deren Anzahl erzwingen . Zum Beispiel gibt es auch keine Möglichkeit, Typen anzugeben.

In Typoskript gibt es bessere Unterstützung für solche Dinge, die es Ihnen ermöglichen, Typ und Anzahl der an die Funktion übergebenen Parameter zu erzwingen, aber was Sie beobachten, ist, wie Javascript funktioniert.

Verwandte Themen