Nehmen wir also an, ich habe Code:

//Javascript
var elements = [];
function addNumbah1(){
    var i = 1;
    elements.push(i);
}
function addNumbah2(){
    var i = 2;
    elements.push(i);
}

Und das geht bis zu addNumbah999 (). Ist es eine schlechte Form, die Variable i jedes Mal zu deklarieren? Wird das irgendetwas kaputt machen? Soll ich tun:

//Javascript
var elements = [];
var i
function addNumbah1(){
    i = 1;
    elements.push(i);
}
function addNumbah2(){
    i = 2;
    elements.push(i);
}
5
ChapmIndustries 29 Nov. 2012 im 20:34

6 Antworten

Beste Antwort

Kurze Antwort: NEIN , JS hebt alle Variablendeklarationen an die Spitze des Bereichs, unabhängig davon, wie oft Sie sie deklariert haben:

var i = 0
for (var i=0;i<10;i++)
{
    var j = i%2;//declared 10 times, on each iteration
}

Wird übersetzt in

var i, j; //i is undefined at this point in the code.
for (i = 0;i<10;i++)
{
    j = i%2;//declared 10 times, on each iteration
}

In Ihrem ersten Beispiel deklarieren Sie i als Variable im Bereich einer Funktion. Dies müssen Sie tun , um eine Überlastung des globalen Bereichs zu vermeiden. Der Speicher, den diese Variablen verwenden, wird beim Aufrufen der Funktion zugewiesen und bei der Rückkehr der Funktion freigegeben (ungefähr Schließungen bilden eine Ausnahme, aber das würde uns zu weit bringen). Bedenken Sie:

var i = 10;
function someF()
{
    var i = 1;
    alert(i);
}
someF();//alerts 1 <-- value of i, local to someF
alert(i);//10, global i is unchanged

Aber wenn Sie das var weglassen würden:

function someF()
{
    i = 1;
    alert(i);
}

Sie werden sehen, dass 1 zweimal alarmiert wird. Wenn JS im aktuellen Bereich keine Variablendeklaration finden kann, wird in den höheren Bereichen gesucht, bis eine Variable gefunden wird. Wenn keine Variable gefunden wird, erstellt JS eine für Sie im höchsten Bereich (global). Überprüfen Sie hier meine Antwort, wie implizite Globale für ein detaillierteres Beispiel funktionieren, oder Lesen Sie die MDN-Seiten, insbesondere den Abschnitt über Namenskonflikte

Zuletzt möchte ich hinzufügen, dass Globale, insbesondere implizite Globale, böse sind. Wissen Sie auch, dass sich der ECMA6-Standard deutlich von globalen Variablen entfernt und die Unterstützung für echte Blockbereiche einführt. Wie Sie hier sehen können
Oh, und wenn Sie überprüfen möchten, ob eine Funktion implizite Globale verwendet: 'use strict'; ist eine großartige Sache:

(function()
{
    'use strict';
    var localVar = 123;//ok
    impliedGlobal = 123;//TypeError!
}());

Wie Sie sehen können, sind implizite Globale nicht zulässig. Die vollständige Erklärung finden Sie unter MDN im strengen Modus

18
Community 23 Mai 2017 im 12:24

Die zweite Form mit globalem i ist möglicherweise etwas langsamer, da sie in einem höheren Bereich definiert ist und die Auflösung von Variablen, die in einem höheren Bereich definiert sind, länger dauert.

Abgesehen von Leistungsüberlegungen halten Sie sich einfach an allgemeine Richtlinien, es sei denn, die Leistung ist wirklich ein Problem. In diesem Fall: Legen Sie Ihre Variablen so eng wie möglich fest .

Ich würde Ihnen dringend empfehlen, das erste Formular zu verwenden.

0
Halcyon 29 Nov. 2012 im 16:39

Der erste Weg, den Sie gemacht haben, ist in Ordnung. Jede Instanz von i hätte keine Kenntnis von dem anderen i in den anderen Funktionen.

Sie sollten dieses Tutorial unter globalen und lokalen Variablen lesen

Könnte ich auch eine Optimierung vorschlagen. Warum können Sie nicht einfach Folgendes tun, um eine Nummer abzudecken (anstelle separater Funktionen für jede Nummer)?

var elements = [];
function addNumbah(number){
    elements.push(number);
}
0
Ivonne 29 Nov. 2012 im 16:40

Innerhalb einer Funktion deklarierte Variablen existieren nur im Bereich dieser Funktion, sodass der gleiche Variablenname für verschiedene Funktionen nichts beeinträchtigt.

In der Tat ist es eine gute Form, Variablen so klein wie möglich zu halten! Globale Variablen können schwierig zu verwalten sein und sehr schlimme Fehler verursachen, insbesondere wenn eine Funktion die Variable nicht verwendet, wenn eine andere Funktion versucht, darauf zuzugreifen.

Speziell für einfache Variablen, deklarieren

var i = 0;

Jedes Mal ist vollkommen in Ordnung.

0
joulesm 29 Nov. 2012 im 16:54

Es ist in Ordnung, Variablen mit demselben Namen in verschiedenen Funktionen zu deklarieren.

0
Jiji 29 Nov. 2012 im 16:43

Sie können eine Variable mehrmals deklarieren. In Ihrem Code deklarieren Sie hier Variable i in verschiedenen Bereichen:

   //Here you are declaring variable i local to addNumbah1,2 functions 
   var elements = [];
   function addNumbah1(){
       var i = 1; 
       elements.push(i);
   }
   function addNumbah2(){
       var i = 2; 
       elements.push(i);
   } 


   //Here v /variable i has been declared globally
   var elements = [];
   var i
   function addNumbah1(){
       i = 1;   
       elements.push(i);
   }
   function addNumbah2(){
       i = 2;  
       elements.push(i);
   }

Beachten Sie, dass Sie eine Variable zwar mehrmals deklarieren können, aber im Allgemeinen keine gute Programmierpraxis ist, da dies zu Fehlern / Problemen in Ihrer Anwendung führen kann

0
Naeem Ul Wahhab 29 Nov. 2012 im 17:24