Was passiert, wenn ich in einer Javascript-Funktion keinen Parameter übergebe?

87

Ich bin neu in der Welt von Javascript und bastele am Schreiben sehr grundlegender Funktionen. Ich bin versehentlich auf das folgende Beispiel gestoßen und bin mir nicht sicher, warum es funktioniert, wenn ich keinen Parameter übergebe, wenn die Funktion dies erfordert.

Beispielfunktion

function myfunction(x) {
    alert("This is a sample alert");
}

Wenn ich jetzt die Funktion myfunction();aufrufe, wird mir die Warnung angezeigt. Warum kann ich die Funktion ohne Fehler oder Warnungen aufrufen, wenn ich keinen Parameter übergeben habe?

BEARBEITEN

Ich habe nicht so viele großartige Antworten erwartet und bin noch keineswegs in der Lage zu sagen, welche Antwort die beste ist. Daher kann ich die Leute bitten, die beste Antwort vorzuschlagen, und ich werde dieser Person die Akzeptanz verleihen.

PeanutsMonkey
quelle
2
Könnte auch hilfreich sein: developer.mozilla.org/en/JavaScript/Guide/Functions
Felix Kling
1
Es gibt keine Überladung basierend auf Funktionssignaturen in JS, daher ist es wirklich egal, wie viele Parameter die Funktion "erwartet". Sie können sogar Parameter übergeben, für die die Funktion nicht definiert ist, und sie einfach mit den Schlüsselwortargumenten abrufen.
scrappedcola
@scrappedcola - Was meinst du mit Überladen und Übergeben von Parametern, für die die Funktion nicht definiert ist? Können Sie Beispiele nennen?
PeanutsMonkey
2
@ ErdnüsseMonkey. Er meinte, man kann nicht zwei Funktionen haben: function foo(x){...}und function foo(x,y,z){...}man kann nur eine Funktion für jeden Namen haben.
Gdoron unterstützt Monica
2
@ ErdnüsseMonkey. Ja, Sie können nicht function overloadingin js haben, Sie haben aber andere Möglichkeiten, es zu verspotten.
Gdoron unterstützt Monica

Antworten:

109

Es wird nichts passieren - das heißt, Sie erhalten keinen Fehler oder eine Warnung, da die Übergabe der Parameter in Javascript optional ist.
Alle Parameter, die nicht "angegeben" wurden, haben den undefinedWert .

function foo(x, y, z){
    //...
}

foo(1);

Innerhalb der fooFunktion jetzt:

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

Sie können sogar weitere Argumente übergeben, z.

foo(1,2,3,4,5,7); // Valid!

Sie können die Anzahl der arguments.lengthvon der Funktion gelieferten Parameter innerhalb der Funktion ermitteln.

function foo(x, y, z) {
    console.log('x value: ' + x);
    console.log('y value: ' + y);
    console.log('z value: ' + z);
    console.log('Arguments length: ' + arguments.length);
}
console.log('Zero parameters');
foo();
console.log('Four parameters');
foo(1, 2, 3, 4);

Beispiel für eine nützliche Funktion, die eine beliebige Anzahl von Parametern verarbeitet:

function max() {
    var maxValue = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        if (maxValue < arguments[i]) {
            maxValue = arguments[i];
        }
    }
    return maxValue;
}

alert(max(1, 5, 7, 2, 88, 32, 44));

Gdoron unterstützt Monica
quelle
Danke für die Live-Demo. Habe nicht so viele gute Antworten erwartet. Wenn ich also eine Funktion wie die Funktion function myfunction (a,b){}myfunction (1,2,3,4,5) habe und diese übergeben habe, gehe ich davon aus, dass sie noch gültig ist? Ist die Erwartung, dass es eine Warnung oder einen Fehler geben wird?
PeanutsMonkey
Entschuldigung, würde es Ihnen etwas ausmachen, die Funktionsweise des Befehls console.logsowie die Argumente zu erläutern .
PeanutsMonkey
@ ErdnüsseMonkey. Gültig! Keine Warnung, kein Fehler, es ist sogar nützlich. Ich werde Ihnen gleich eine Demo geben.
Gdoron unterstützt Monica
1
@ ErdnüsseMonkey. Es funktioniert auch mit IE, wenn Sie die Entwicklerkonsole installiert haben. Ich denke, es ist standardmäßig von IE8 + installiert. Ich habe nicht verstanden, worüber du geschrieben hast alert.
Gdoron unterstützt Monica
1
@ ErdnüsseMonkey. 1. Sie können keinen Code haben, nachdem returner ignoriert wurde. 2. Sie erhalten keine Fehler oder Warnungen. Siehe diese DEMO
Gdoron unterstützt Monica
9

Alle Argumente in JavaScript-Funktionen sind optional (lesen Sie "lose eingegeben").

JavaScript-Funktionen können mit einer beliebigen Anzahl von Argumenten aufgerufen werden, unabhängig von der Anzahl der in der Funktionsdefinition genannten Argumente. Da eine Funktion lose typisiert ist, kann sie den erwarteten Argumenttyp nicht deklarieren, und es ist zulässig, Werte eines beliebigen Typs an eine Funktion zu übergeben. Wenn eine Funktion mit weniger Argumenten als deklariert aufgerufen wird, haben die zusätzlichen Argumente den undefinierten Wert.

Sie können auf die Argumente einer Funktion innerhalb der Funktion verweisen, indem Sie die benannten Argumentvariablen oder das Argumentobjekt verwenden. Dieses Objekt enthält einen Eintrag für jedes an die Funktion übergebene Argument. Der Index des ersten Eintrags beginnt bei 0. Wenn einer Funktion beispielsweise drei Argumente übergeben werden, können Sie auf das Argument wie folgt verweisen:

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - The Definitive Guide, 5. Ausgabe
j08691
quelle
7

So funktioniert JavaScript. Parameter sind optional und haben den nicht wirklich wertvollen Wert "undefined" in der Funktion, wenn sie in einem Funktionsaufruf fehlen.

Mit "optional" meine ich genau das: Das Aufrufen einer Funktion beinhaltet eine beliebig lange Liste von Parametern. Es braucht keine Beziehung zwischen der Anzahl von Parametern zu sein geben zu einer Funktion und die Zahl erklärt . Der beste Weg, um an diese Erklärung zu denken, dann:

function x(a, b, c) {
  // ...
}

ist, dass Sie eine Funktion deklarieren und den Namen "a" an den ersten Parameter, "b" an den zweiten und "c" an den dritten Parameter binden. Es ist jedoch keineswegs garantiert, dass dies tatsächlich der Fall ist einer dieser Werte bei einem späteren Aufruf der Funktion an einen Wert gebunden wird.

Aus dem gleichen Grund können Sie eine Funktion ohne Parameter definieren und diese dann über das argumentsObjekt "finden" :

function noArgs() {
  var a = arguments[0], b = arguments[1], c = arguments[2];
  // ...
}

Das ist also nicht ganz das Gleiche wie die erste Funktion, aber es ist in den meisten Punkten nah, die praktisch zählen.

Der "undefinierte" Wert in JavaScript ist ein Wert, aber seine Semantik ist in Bezug auf Sprachen ungewöhnlich. Insbesondere ist es nicht genau das gleiche wie der nullWert. Außerdem ist "undefiniert" selbst kein Schlüsselwort. Es ist nur ein semi-spezieller Variablenname!

Spitze
quelle
Könnten Sie näher erläutern, was Sie unter optional"nicht wirklich ein Wert" verstehen undefined?
PeanutsMonkey
@PeanutsMonkey - Wenn die Variable nicht angegeben ist, ist dies der Fall undefined.
Derek 19 會 功夫
@Pointy - Was meinst du damit, dass es keine Garantie dafür gibt, dass einer der deklarierten Parameter tatsächlich an einen Wert gebunden ist?
PeanutsMonkey
1
@PeanutsMonkey JavaScript ist eine dynamische Sprache . Beim Aufruf einer Funktion ist die Deklaration der Funktion einschließlich der Anzahl der Parameter nicht wichtig. Sie können also eine Funktion mit so vielen Parametern deklarieren, wie Sie möchten. Dies schränkt jedoch nicht ein, wie viele Parameter beim Aufruf Ihrer Funktion tatsächlich übergeben werden. (Auf diese Weise ähnelt es C, zumindest C früher.) Wenn Sie also einen Parameter deklarieren und ein Aufruf ohne Angabe eines Parameterwerts erfolgt, ist der Parameter undefined.
Pointy
3

JavaScript hat keine Standardwerte für Funktionsparameter wie andere Sprachen. Sie können also so viele oder so wenig Argumente übergeben, wie Sie möchten.

Wenn Sie keinen Wert übergeben, lautet der Parameter undefined.

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

Wenn Sie mehr Parameter als in der Signatur übergeben, können Sie verwenden arguments.

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]
Rakete Hazmat
quelle
Vielen Dank. undefined
Können
@ ErdnüsseMonkey: Huh? Was ist dein Problem?
Rocket Hazmat
Kein Problem an sich. Ich bezog mich auf meine Folgefrage an David über die Übergabe weiterer Parameter, die Sie in Ihre Antwort aufgenommen haben. Was ich nicht ganz verfolge, ist was du meinst logs? Wo protokolliert es es?
PeanutsMonkey
1
@PeanutsMonkey: Es protokolliert es in Ihrer "JavaScript-Konsole". In den meisten Browsern können Sie drücken F12oder Ctrl+Shift+J, um darauf zuzugreifen.
Rocket Hazmat
1
Der erste Satz ist ab ES2015 veraltet ...
Heretic Monkey
2

Sie können auch mehr Argumente als nur das in der Funktion erwähnte angeben

myFunction(1,2,3,4,5,6,7,'etc');

Sie können die argumentsEigenschaft eines Arrays verwenden, um die angegebenen Argumente anzuzeigen.

AlbertVanHalen
quelle
@ Albert Argumente ist nicht Array sein Array wie Objekt siehe
Mahi
1

Weil es keinen Fehler gibt, bis die Funktion erwartet, mit dem Parameter arbeiten zu können, den Sie übergeben sollen.

Beispielsweise:

function myfunction(x) {
    return x*2;
}

Würde einen Fehler werfen; wenn auch wahrscheinlich nur ein NaN(in diesem Fall) oder ein variable is undefined.

David sagt, Monica wieder einsetzen
quelle
Okay, solange ich nicht auf den Parameter in der Funktion verweise, wird kein Fehler angezeigt? Ist das richtig?
PeanutsMonkey
Wenn ich nun das von Ihnen bereitgestellte Beispiel näher erläutere function myfunction(a,b) { var calc = a+b; return;}und dann die Funktion document.write(myfunction(1.2));aufrufe, warum erhalte ich dann immer noch den Wert von undefined, obwohl ich einen Parameter übergebe?
PeanutsMonkey
1
Weil du nichts zurückgibst. In Ihrem Beispiel müssen Sie explizit einen Wert zurückgeben: entweder return calc; oder return a+b;(natürlich als letzte Zeile; und letztere returnanstelle von var calc).
David sagt, Monica am
Sie meinen also, ich muss keine Variable deklarieren, wenn ich das tue return a+b;?
PeanutsMonkey
@PeanutsMonkey - Sie können mehr über lesen return hier .
Derek 19 會 功夫
0

Wenn Sie das Argument weglassen, ist sein Wert undefined. Auf diese Weise können Sie ganz einfach optionale Parameter erstellen.

Ein weiteres Merkmal ist die Möglichkeit, eine Funktion ohne Parameter zu definieren und sie mit Argumenten erfolgreich aufzurufen, wobei das argumentsObjekt verwendet wird. Auf diese Weise können Sie auf einfache Weise Argumentarrays mit variabler Länge erstellen.

Kendall Frey
quelle
0

In javascript console.log gibt innerhalb einer Funktion undefined als Ausgabe für nicht übergebene Parameter aus, aber außerhalb der Funktion gibt es keinen definierten Fehler, da innerhalb einer Funktion Browser die Variable explizit deklarieren. Zum Beispiel

console.log(x) 

gibt VM1533: 1 Ungefangener Referenzfehler: x ist nicht definiert, wohingegen

function test(x) {
console.log(x)
}
test(); 

gibt undefiniert. Dies liegt daran, dass der Funktionstest () vom Browser wie folgt umgeschrieben wird:

function test(x) {
    var x;
    console.log(x)
    }

Ein anderes Beispiel : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

ist immer noch undefiniert, wenn die Funktion wird

function test(x) {
    var x;
    console.log(x)
    }

Die Warnung im folgenden Beispiel gibt undefiniert: -

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

Die obige Funktion wird: -

 function test() {
    var x;
    alert(x);
    x =10;
    }

Der Bereich der Javascript-Variablen innerhalb einer Funktion ist der Bereich der Funktionsebene und nicht die Blockebene. Zum Beispiel

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

gibt die Ausgabe aus als:

j is 5 
i is 10

Wieder ist die Funktion wie folgt geworden:

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
Goyal Vicky
quelle