2012-06-19 2 views
10

Als Beispiel darf ich die gleiche Variable und Parameter verwenden? Auf welche Probleme kann ich stoßen?Sind die gleichen Variablen- und Parameternamen in einer Javascript-Funktion erlaubt?

Beispielcode

function mytask(name,title){ 
      var name = name; 
      var title = title; 
      var showalert = ("Hi " + name + " your job title is " + title); 
      console.log(showalert); 
      return showalert; 
     } 

document.write(mytask("dan", "administrator")); 
+0

Wenn Sie könnten, wie würden Sie auf jeden von ihnen beziehen? – cheeken

+0

Sie meinen, können Sie die Named-Argumente, die Sie an die Funktion als die Variablennamen in der Funktion übergeben? Ja, ja, du kannst. Hast du überhaupt ein Problem damit erlebt? –

+0

Der Code funktioniert. Ich möchte dies jedoch nicht beibehalten. –

Antwort

5

Well in Javascript können Sie denken, dass, Bereiche meine geschweiften Klammern definiert: { Und }, und innerhalb eines Bereichs Variablen neu definiert werden kann, so sehen:

function x(){ 
    var name=3; 
    var name=4; 
    console.log(name); // output is: 4 
} 
x(); 

Aber das ist nur die halbe Wahrheit, Tatsächlich passiert der Interpreter den Code und verschiebt alle var-Anweisungen an den Anfang, während ihnen eine undefined zugewiesen wird (und alle Argumente werden definiert und aus dem Stack übernommen), und dann wird der von Ihnen geschriebene Code ausgeführt. Also alle var nach dem ersten wird einfach ignoriert. Und der Code, den Sie schrieben, ist gleich:

function mytask(name,title){ 
    var name = arguments[0]; 
    var title = arguments[1]; 
    name = name; 
    title = title; 
    var showalert = ("Hi " + name + " your job title is " + title); 
    console.log(showalert); 
    return showalert; 
} 

document.write(mytask("dan", "administrator")); 

So ist Ihre erneute Verzögerung und Zuweisung redundant. Wie auch immer - der Umfang ändert sich nicht, nichts wird anders sein.

bearbeiten

Der Interpreter Ihren Code übergeht, mit etwas ausführt, wird jede var x = y; Anweisung aufgeteilt in var x = undefined; und x=y;. Und die var x = undefined; wird an den Anfang des Codes verschoben. Und die x=y; wird an der gleichen Stelle wie die ursprüngliche Aussage sein. Wenn Sie die Dinge über den Stack nicht verstanden haben, kümmern Sie sich nicht darum, wie Compiler Funktionsaufrufe in Assembly konvertieren - es ist es wert zu wissen, falls Sie Zeit haben; aber nicht die wichtige Sache hier.

Wie auch immer - direkt nach diesen Änderungen, und vielleicht einige Optimierungen vorgenommen werden, wird der resultierende Code ausgeführt. Dies ist nicht der Code, den du geschrieben hast, sondern ein gleicher. Was Sie bei der Neudefinition der Argumente angegeben haben, ist ein Kantenfall, bei dem diese Transformationen sichtbar werden.

+0

Könntest du bitte erläutern, was du meinst mit "Verschiebt alle var-Anweisungen an den Anfang, während ihnen ein undefined zugewiesen wird (und alle Argumente werden definiert und aus dem Stack genommen), und dann wird der von dir geschriebene Code ausgeführt"? – PeanutsMonkey

+0

@PeanutsMonkey Siehe bearbeiten –

+0

Okay, nur um klar zu verstehen, was du meinst ich werde erbrechen. Lass es mich wissen, wenn ich es falsch verstanden habe. Wenn ich die Funktion wie in meiner Frage habe, wo der Parameter und die Variable die gleiche Deklaration teilen, meinen Sie, der Interpreter würde 'name = name' in' name = undefiniert' und 'name = name' aufteilen. Ist das richtig? – PeanutsMonkey

1

Sicher, dass Sie auf Probleme stoßen können. Schau dir das an.

function mytask(name,title){ 
      console.log(name); 
      console.log(title) 
      var name = "oops"; 
      var title = "rawr"; 
      console.log(name); 
      console.log(title) 
} 

mytask("dan", "administrator"); 

Abgesehen von sehr verwirrend sein, console.log(name); Aufruf gibt uns zwei unterschiedliche Ergebnisse (weil wir es neu definiert). Es ist erlaubt, aber es ist keine gute Idee.

Bearbeiten: Interessanterweise (ich wusste das nicht), die oben genannten Schrauben die implizite arguments[] Array auch. Zum Beispiel tun:

for(var i = 0; i < arguments.length; ++i) { 
    console.log(arguments[i]); 
} 

irgendwo in unserer Funktion (post-Neuzuordnung) noch oops und rawr ausgibt. Offensichtlich ist dies eine schlechte, schlechte Idee.

1

Sie können Variablen mit dem gleichen Namen wie die Parameter verwenden, da der Wert trotzdem gleich ist, es sei denn, die Variable mit dem gleichen Namen hat einen anderen Wert als der Parameter.

1

Eigentlich gibt es keinen Grund, es zu tun. Sobald Sie sie an die Funktion übergeben haben, werden sie initialisiert und Sie können sie verwenden, ohne sie anderen Variablen zuzuweisen.

2

Denken Sie darüber auf diese Weise:

var name = name; 

Der einzige Weg, name auf den Wert von name eingestellt werden, wenn name ist bereits definiert. Es muss nicht zweimal durchgeführt werden, wenn name bereits den gewünschten Wert hat.

2

Nun, ich denke, eine Erklärung wird nicht schaden.)

Zuerst werden alle Parameter der Funktion bereits als lokal für diese Funktion deklariert. (Es ist ein bisschen komplexer, aber sagen wir, diese Erklärung deckt das meiste davon ab). Es macht also keinen Sinn, sie wieder zu definieren: Sie werden danach nicht "lokaler".))

Zweitens ist es möglich var name = name innerhalb der function(name) aus den gleichen Gründen zu schreiben, warum es möglich ist, var name = 123; var name = 345; zu schreiben. Die zweite var wird nur still ignoriert.

Und wenn Sie schreiben var name = 123; var name = name;, werden Sie nur einige Tastenanschläge verschwenden - als wiederum ist es das gleiche wie Sie name = name; irgendwo in Ihrem Code schreiben.)

Und das, btw, erklärt, die arguments zu vermasseln. Siehe, name ist eigentlich ein Alias ​​für sein Element.

+0

Was meinst du mit "Die zweite Var wird einfach still ignoriert werden" sowie erklärt, die "Argumente" zu vermasseln? – PeanutsMonkey

+0

Möchten Sie, dass ich Ihnen näher erläutere, wie das Heben funktioniert? – raina77ow

+0

@ raina77ow Funktioniert das im "strikten" Modus? – Medorator

Verwandte Themen