3 Stimmen

Ist dies in der richtigen Form von JavaScript?

Ist das unten stehende Skript in der richtigen Form von JavaScript?

function foo(){
    return function(x){
        alert(x)
    }
}
foo()("bar");

   There are 2 parenthesis.

Es Werke aber ich weiß nicht, ob sie in der richtigen Form vorliegt.
Wenn ja, heißt das, dass dies auch richtig ist?

function foo(){
    return function(){
        return function(){
            return function(){
                return function(x){
                    alert(x)
                }
            }
        }
    }
}
foo()()()()("?!?!?!");

Es sieht seltsam aus, aber es funktioniert...

2voto

cdhowie Punkte 142402

Ja, das ist eine gültige Syntax. Stilistisch ist daran nichts auszusetzen, abgesehen davon, dass es für neue Programmierer etwas verwirrend sein könnte. Die wiederholten () zeigen an, dass der vorherige Ausdruck als Funktion aufgerufen wird. Ihr erstes Beispiel könnte etwas klarer sein, wenn Sie es so schreiben würden:

( foo() )("bar");

Ihr letztes Beispiel ist effektiv:

( ( ( ( foo() )() )() )() )("?!?!?!");

2voto

James Montagne Punkte 75564

Dies wäre der richtige Weg, um diese Konstrukte aufzurufen. Die bessere Frage ist, warum... Sie können tun, was Sie gepostet haben, aber ich würde es sehr schwer finden, die Verschachtelung von Funktionen 5 mal zu rechtfertigen.

1voto

Gareth Punkte 123487

Funktionen in Javascript sind Objekte "erster Ordnung", was bedeutet, dass sie erstellt und weitergegeben werden können wie jedes andere Objekt. Also ja, Sie können sie von einer anderen Funktion zurückgeben, und genau das tun, was Sie erwähnen:

var f = g();
f();

// The same as
g()();

1voto

QuentinUK Punkte 2830

Die Reihenfolge der Funktionsaufrufe wird durch Hinzufügen von Parametern angezeigt:-

function foo(a){
    var A=a;
    return function(a){
        A+=a;
        return function(a){
            A+=a; 
            return function(a){
                A+=a;
                return function(a){
                    A+=a;
                    alert(A)
                }
            }
        }
    }
};
foo('a')('b')('c')('d')('e');// displays abcde

Sie könnten die Funktion so gestalten, dass sie sich selbst zurückgibt, so dass sie wiederholt aufgerufen werden kann, z. B.

var foo = (function(){
    var v=1;
    return function f(x){
        return x==undefined?v: (v*=x, f);
    }
})();
foo.toString=function(){
return foo();
};
alert(foo(1)(2)(3)(4)(5)(6)(7)(8)(9)(10));

Verschachtelung dient normalerweise dazu, Variablen privat zu halten, z.B.

var factorial=(function(n){
    var precog = [1,1];
    var factorial= function f(y){
        if(precog[y]==undefined){
            precog[y]=y*f(y-1);
        }
        return precog[y];
    };
    factorial(n);// initialise some precogs
    return factorial;
})(100); 

Da precog in Klammern deklariert ist, können seine Werte, die intern von der Funktion factorial berechnet werden, nicht verändert werden.

Die der Variablen zugewiesene Funktion wird wie üblich aufgerufen:-

factorial(3);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X