Was ist der Zweck des Schlüsselworts var und wann sollte ich es verwenden (oder weglassen)?

1543

HINWEIS : Diese Frage wurde aus Sicht von ECMAScript Version 3 oder 5 gestellt. Die Antworten könnten mit der Einführung neuer Funktionen in der Version von ECMAScript 6 veraltet sein.

Was genau ist die Funktion des varSchlüsselworts in JavaScript und was ist der Unterschied zwischen

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

und

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

Wann würden Sie eines von beiden verwenden und warum / was macht es?

Alex
quelle
3
Beeinflusst das Setzen einer neuen Zeile nach einem Komma das Verhalten, wenn var-Deklarationen verkettet werden? var x = 1, y = 2, [return] z = 3;
Alfabravo
4
Wenn Sie "var" nicht verwenden, werden Sie auch für den Fall sichtbar, dass der von Ihnen ausgewählte Variablenname eine zuvor definierte globale Variable ist. Sehen Sie meine Reise der Trauer hier: stackoverflow.com/questions/16704014/…
Scott C Wilson
5
@ Ray Toals Melonenkarten-Blog-Post (definitiv eine Lektüre wert) wurde auf blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
Hephaestus
Ich hätte nie gedacht, dass ein Gedicht mich zum Nachdenken über ein programmatisches Problem anregen könnte
Félix Gagnon-Grenier
1
@ Gibolt, aber sieh dir das Fragendatum an, es ist ein bisschen unfair, eine Frage von 2009 zu beschwören, um das zu sagen. Obwohl es für die Wartbarkeit immer noch wie zum aktuellen Datum gültig ist, gibt es eine Reihe von nicht "modernem JS" -Code.
Andre Figueiredo

Antworten:

1356

Wenn Sie sich im globalen Bereich befinden, gibt es keinen großen Unterschied. Lesen Sie Kangax ' Antwort zur Erklärung

Wenn Sie sich in einer Funktion befinden, varwird eine lokale Variable erstellt. "No var" sucht in der Bereichskette, bis die Variable gefunden wird oder der globale Bereich erreicht wird (an diesem Punkt wird sie erstellt):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Wenn Sie keine Aufgabe ausführen, müssen Sie Folgendes verwenden var:

var x; // Declare x
Greg
quelle
31
Ist "nicht wirklich viel Unterschied" == "Kein Unterschied"?
Alex
65
Nun ja, es gibt einen Unterschied :) Ob dieser Unterschied wichtig ist, ist eine andere Frage. Siehe meine Antwort weiter unten: stackoverflow.com/questions/1470488/…
kangax
4
Ich denke, das könnte Alex 'Punkt sein, weshalb er es mit dem Operator "ist gleich" geschrieben hat!
James Bedford
18
Es ist, als würde man sich mit einer Railgun erschießen ... Vergessen Sie, ein 'var' vor die eigene Variable zu setzen und am Ende irgendwo in der Scope-Kette eine Variable zu ändern ... Versuchen Sie, Java / C / Python / etc. Zu überzeugen. Entwickler, dass sich JavaScript lohnt. Ha! C / C ++ - Fallstricke sehen dagegen gut aus. Stellen Sie sich vor, Sie müssen JavaScript debuggen ... Und einige Leute tun das natürlich. Und es gibt so viel Code (und nicht einfachen Code, wohlgemerkt) in JavaScript geschrieben ...
Albus Dumbledore
6
Wenn Sie sich im globalen Bereich befinden, gibt es keinen Unterschied. >> Es gibt einen Unterschied, der in der Antwort unten erklärt wird
Max Koretskyi
746

Es gibt einen Unterschied .

var x = 1 deklariert eine Variable x im aktuellen Bereich (auch als Ausführungskontext bezeichnet). Wenn die Deklaration in einer Funktion erscheint, wird eine lokale Variable deklariert. Wenn es sich im globalen Bereich befindet, wird eine globale Variable deklariert.

x = 1ist dagegen lediglich eine Eigenschaftszuweisung. Es wird zunächst versucht, eine Lösung xgegen die Bereichskette zu finden. Wenn es irgendwo in dieser Bereichskette gefunden wird, führt es eine Zuweisung durch. Wenn es nicht gefunden wird x, erstellt es nur dann eine xEigenschaft für ein globales Objekt (das ein Objekt der obersten Ebene in einer Bereichskette ist).

Beachten Sie nun, dass keine globale Variable deklariert wird, sondern eine globale Eigenschaft erstellt wird.

Der Unterschied zwischen den beiden ist subtil und kann verwirrend sein, es sei denn, Sie verstehen, dass Variablendeklarationen auch Eigenschaften erstellen (nur für ein Variablenobjekt) und dass jede Eigenschaft in Javascript (also ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und Nicht löschen.

Da die Variablendeklaration eine Eigenschaft mit dem DontDelete-Flag erstellt, besteht der Unterschied zwischen var x = 1und x = 1(bei Ausführung im globalen Bereich) darin, dass die erstere - die Variablendeklaration - die DontDelete'able-Eigenschaft erstellt und die letztere nicht. Infolgedessen kann die über diese implizite Zuweisung erstellte Eigenschaft aus dem globalen Objekt gelöscht werden, und die erstere - die über die Variablendeklaration erstellte - kann nicht gelöscht werden.

Dies ist natürlich nur eine Theorie, und in der Praxis gibt es aufgrund verschiedener Fehler in Implementierungen (z. B. von IE) noch mehr Unterschiede zwischen den beiden .

Hoffe alles macht Sinn :)


[Update 16.12.2010]

In ES5 (ECMAScript 5; kürzlich standardisierte 5. Ausgabe der Sprache) gibt es einen sogenannten "strengen Modus" - einen Opt-In-Sprachmodus, der das Verhalten nicht deklarierter Zuweisungen geringfügig ändert. Im strengen Modus ist die Zuweisung zu einem nicht deklarierten Bezeichner ein ReferenceError . Der Grund dafür war, versehentliche Zuweisungen zu erfassen und die Schaffung unerwünschter globaler Eigenschaften zu verhindern. Einige der neueren Browser haben bereits damit begonnen, den strengen Modus zu unterstützen. Siehe zum Beispiel meine kompatible Tabelle .

Kangax
quelle
Wenn ich mich richtig erinnere, habe ich wohl einmal einen Weg gefunden, deletemit einem evalHack zu einer var-deklarierten Variablen zu gelangen . Wenn ich mich an den genauen Trick erinnere, werde ich hier posten.
Turm
3
@Mageek Er könnte sich um eval-deklarierte Variablen kümmern, die löschbar sind. Ich habe einmal einen Blog-Beitrag darüber geschrieben .
Kangax
1
Ein bisschen außer Thema, aber hier als Referenz erwähnen. "let" ist "var" sehr ähnlich und wird in Mozilla unterstützt. Der Hauptunterschied besteht darin, dass der Gültigkeitsbereich einer var-Variablen die gesamte umschließende Funktion ist, bei der "let" auf ihren Block beschränkt ist
mac
@ Kangax Was wäre, wenn die letzten beiden Zeilen von Alex 'Beispielen gemischt wären: var someObject = {}und someObject.someProperty = 5? Würde somePropertyglobal werden, während das Objekt, dessen Eigentum es ist, lokal bleibt?
Snapfractalpop
1
Der Spezifikationsname für das, was @kangax das DontDelete- Flag nennt, ist konfigurierbar (= false) . Sie können dies in Bezug auf Object.definePropertyundObject.getOwnPropertyDescriptor
Paul S.
137

Zu sagen, dass es der Unterschied zwischen " lokal und global " ist, ist nicht ganz richtig.

Es könnte besser sein, es als den Unterschied zwischen " lokal und am nächsten " zu betrachten. Der nächste kann sicherlich global sein, aber das wird nicht immer der Fall sein.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
Jonathan Lonowski
quelle
3
Ist nicht der nächste Bereich, den outerSie definieren var global = false;?
Snekse
@Snekse: 'next' gilt nicht, wenn <code> var global = false; </ code> deklariert ist. In dieser Deklaration wird 'global' in den Bereich von Outer () gestellt, da in der Deklaration 'var' verwendet wird. Da 'var' in inner () nicht verwendet wird, ändert es den Wert in der nächsten Stufe, die Outer () ist.
Mitch
Ich frage mich, ob sich Ihr Kommentar ändern würde, wenn Sie diese Zeile var global = local;in ändern würden. In diesem Fall wäre der Near-Bereich von Local der "lokale" äußere Bereich, der aktiv definiert wird. Es wird jedoch seltsam, wenn Sie dieselbe Zeile var global = globalin ändern. In diesem Fall liegt der nächste Bereich bei der Suche nach dem Wert von globalim globalen Fensterbereich auf einer höheren Ebene.
Snekse
80

Wenn Javascript in einem Browser ausgeführt wird, ist Ihr gesamter Code von einer with-Anweisung umgeben, wie folgt:

with (window) {
    //Your code
}

Weitere Infos zu with- MDN

Da vareine Variable im aktuellen Bereich deklariert wird , gibt es keinen Unterschied zwischen der Deklaration var innerhalb des Fensters und der Deklaration überhaupt nicht.

Der Unterschied entsteht, wenn Sie sich nicht direkt im Fenster befinden, z. B. innerhalb einer Funktion oder innerhalb eines Blocks.

Mit varkönnen Sie externe Variablen mit demselben Namen ausblenden. Auf diese Weise können Sie eine "private" Variable simulieren, aber das ist ein anderes Thema.

Als Faustregel gilt, immer zu verwenden var, da sonst die Gefahr besteht, dass subtile Fehler auftreten.

EDIT: Nach den Kritiken, die ich erhalten habe, möchte ich Folgendes hervorheben:

  • vardeklariert eine Variable im aktuellen Bereich
  • Der globale Geltungsbereich ist window
  • Nicht varimplizite Deklarationen varim globalen Bereich (Fenster) verwenden
  • Das Deklarieren einer Variablen im globalen Bereich (Fenster) mit varist dasselbe wie das Weglassen.
  • Das Deklarieren einer Variablen in Bereichen, die sich von der Verwendung von Fenstern unterscheiden, var ist nicht dasselbe wie das Deklarieren einer Variablen ohnevar
  • Immer varexplizit deklarieren, da dies eine gute Praxis ist
Kentaromiura
quelle
1
Ich habe Sie nicht abgelehnt, aber Umfang ist wahrscheinlich ein besseres Wort als Fenster. Ihre ganze Erklärung ist etwas stumpf.
Robert Harvey
4
Ich nenne Dinge einfach mit ihrem Namen, Sie möchten sie "globaler Bereich" nennen, es ist in Ordnung, aber clientseitig ist gemäß Konvention das Fensterobjekt, das das letzte Element der Bereichskette ist, weshalb Sie jeden aufrufen können Funktion und jedes Objekt im Fenster ohne "Fenster" zu schreiben.
Kentaromiura
2
+1 das ist eine wirklich nette Erklärung - ich habe das var / no var-Problem noch nie so gerahmt (kein Wortspiel beabsichtigt) gehört.
Doug
Der größte Teil dieser Antwort ist letin ES6 veraltet .
Evan Carroll
3
@EvanCarroll Diese Antwort ist auch technisch falsch, da das Weglassen von var keine Variable deklariert, sondern eine löschbare Eigenschaft für das globale Objekt erstellt. Außerdem ist im ES5-Modus "use strict" der größte Teil der Antwort offensichtlich nicht korrekt. Dies wurde in dieser Antwort nicht einmal berücksichtigt, da zum Zeitpunkt der Frage kein Verweis auf die Javascript-Version (gestern hinzugefügt) vorhanden war, was impliziert, dass der Referenzstandard (zu diesem Zeitpunkt) ECMA 262 3rd Edition war.
Kentaromiura
43

Verwenden Sie immer das varSchlüsselwort, um Variablen zu deklarieren. Warum? Eine gute Codierungspraxis sollte an sich schon ein Grund genug sein, aber wenn sie weggelassen wird, bedeutet dies, dass sie im globalen Bereich deklariert ist (eine Variable wie diese wird als "implizite" globale bezeichnet). Douglas Crockford empfiehlt, niemals implizite Globale zu verwenden und gemäß den Apple JavaScript Coding Guidelines :

Jede Variable, die ohne das var Schlüsselwort erstellt wurde, wird im globalen Bereich erstellt und bei der Rückkehr der Funktion (da sie nicht außerhalb des Bereichs liegt) nicht als Müll gesammelt, was die Möglichkeit eines Speicherverlusts bietet.

Steve Harrison
quelle
17
"Gute Codierungspraxis" sollte niemals ein ausreichender Grund für sich sein. Es läuft darauf hinaus, "einige Leute im Internet sagten, so sollte mein Code aussehen". Das ist noch weniger gültig als "mein Lehrer sagte", es sei denn, man versteht den Grund für die Regel zumindest vage.
CHao
@cHao Ich denke, es good coding practiceist immer ein ausreichender Grund, wenn es sich um eine empfohlene Best Practice handelt, die von mehreren Javascript-Autoren verwendet wird.
Chris S
8
@ChrisS: Nein, "gute Codierungspraxis" ist an sich kein Grund. Der Grund , warum es als gute Praxis angesehen wird, ist wichtig. Sofern diese Autoren Ihnen nicht sagen, warum sie es empfehlen, sollte ihre Empfehlung keinerlei Gewicht haben. Wenn Sie mit den Gründen nicht einverstanden sind, können Sie es als schlechten Rat betrachten. Und wenn Sie ihm folgen, ohne jemals zu fragen, warum, dann beginnt der Frachtkultismus.
CHao
30

Hier ist ein gutes Beispiel dafür, wie Sie davon abgehalten werden können, lokale Variablen nicht zu deklarieren mit var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( iwird bei jeder Iteration der Schleife zurückgesetzt, da sie nicht lokal in der forSchleife, sondern global deklariert wird ), was schließlich zu einer Endlosschleife führt

Chris S.
quelle
Huch! Ich kann mir nur alle Fehler vorstellen, die durch diesen Tippfehler verursacht werden könnten.
BonsaiOak
2
Ich bin neugierig, warum du i als Argument an zwei weitergibst ()? (innerhalb der for-Schleife) ist das redundant?
Kalin
Das Argument wird in der Funktion two () ignoriert, die in der Funktion one () gekapselt ist, da die Funktion two () ohne Parameter definiert wurde. Sie sind ganz richtig, es wird nicht benötigt, da es keine Rolle spielt.
KK.
Fehler oder Funktion?
TheMaster
13

Ich würde sagen, es ist besser, varin den meisten Situationen zu verwenden.

Lokale Variablen sind immer schneller als die Variablen im globalen Bereich.

Wenn Sie keine varVariable deklarieren, befindet sich die Variable im globalen Bereich.

Für weitere Informationen können Sie in Google nach "Scope Chain JavaScript" suchen.

Billy
quelle
Wenn Sie eine Variable mit dem Schlüsselwort var deklarieren, wird sie zur Laufzeit erstellt. Sollte sie nicht langsamer sein? Weil der andere zur analysierten Zeit erstellt wird.
Barış Velioğlu
@ RyuKaplan - hey, ist das wahr? Ich habe versucht zu googeln und konnte keine Informationen zu diesem Thema bekommen! Haben Sie eine Quellenautorität für diese Behauptung? Thx
Mike Nagetier
@ RyuKaplan Das Parsen / Kompilieren unterscheidet sich vom tatsächlichen Ausführen des Codes.
Gcampbell
11

Nicht benutzen var!

varwar die Möglichkeit vor ES6, eine Variable zu deklarieren. Wir sind jetzt in der Zukunft , und Sie sollten als solche codieren.

Verwenden Sie constundlet

constsollte in 95% der Fälle verwendet werden. Dadurch kann sich die Variablenreferenz nicht ändern, sodass sich die Eigenschaften von Arrays, Objekten und DOM-Knoten ändern können und wahrscheinlich auch ändern sollten const.

letsollte für jede Variable verwendet werden, die eine Neuzuweisung erwartet. Dies schließt innerhalb einer for-Schleife ein. Wenn Sie jemals varName =über die Initialisierung hinaus schreiben , verwenden Sie let.

Beide haben Block-Level-Scoping, wie in den meisten anderen Sprachen erwartet.

Gibolt
quelle
2
Ersetzen Sie alle 'var' durch 'const' (ersetzen Sie alle). Sie werden schnell feststellen, wo sich Ihre neu zugewiesenen Variablen befinden. Wenn Sie zu viele davon haben, codieren Sie wahrscheinlich anti-patternly: Die meisten neu zuweisbaren Variablen können in Abschlüsse oder als Objekteigenschaften eingebettet werden. Wenn Sie ein paar haben: Verwenden Sie 'let' für sie. Wenn einige Variablen überhaupt nicht mit 'var' gelöscht wurden, bleiben sie nicht deklariert und sind im globalen Raum immer noch vorhanden. Über @ Gibolt Kommentar 'innerhalb einer for-Schleife' wird auch empfohlen, solche Schleifen in "95% der Fälle" zu vermeiden ;-): Array-Methoden sind großartig.
Allez l'OM
Wenn wir sagen, dass const in 95% der Fälle verwendet werden sollte, scheinen wir uns von der guten Praxis zu entfernen und uns dem Dogma zuzuwenden.
Agamemnus
9

ein weiterer Unterschied, z

var a = a || [] ; // works 

während

a = a || [] ; // a is undefined error.
Pranay Warke
quelle
1
Können Sie erklären, warum dies bei Variablen funktioniert, die mit 'var' definiert sind, und bei Variablen, die nicht mit var definiert sind? Wird bei der Bewertung der rechten Seite der Zuordnung eine Variable erstellt var?
Matt
6
@Lucek, weil var aan den oberen Rand des Bereichs angehoben und auf null gesetzt wird, wodurch die Variable deklariert, aber nicht initialisiert wird. In der Zuweisung haben Sie einen Verweis auf eine undefinierte Nullvariable, die als false ausgewertet wird, und setzen die Zuweisung auf []. In letzterem haben Sie eine Zuordnung zum Eigentum ades Eigentums a. Sie können einer Eigenschaft zuweisen, die nicht vorhanden ist - indem Sie sie bei Zuweisung erstellen, aber Sie können nicht aus einer Eigenschaft lesen, die nicht vorhanden ist, ohne dass ein ReferenceErrorWurf auf Sie geworfen wird.
Evan Carroll
1
@EvanCarroll: Es wird an die Spitze des Bereichs angehoben und auf undefiniert anstatt auf null gesetzt.
Mithunsatheesh
8

Die Verwendung varist immer eine gute Idee, um zu verhindern, dass Variablen den globalen Bereich überladen und Variablen in Konflikt miteinander geraten, was zu unerwünschtem Überschreiben führt.

Kevinji
quelle
8

Ohne var- globale Variable.

Es wird dringend empfohlen, IMMER eine varAnweisung zu verwenden, da die globale Variable init im lokalen Kontext böse ist. Wenn Sie diesen schmutzigen Trick benötigen, sollten Sie am Anfang der Seite einen Kommentar schreiben:

/* global: varname1, varname2... */
Anatoliy
quelle
3

Dies ist ein Beispielcode, den ich geschrieben habe, damit Sie dieses Konzept verstehen:

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3
Neujahr
quelle
2
Die Funktion ist keinesfalls "anonym". In der Tat ist es ungefähr so ​​sichtbar benannt, wie es nur sein kann.
Ingo Bürk
Vielen Dank, dass Sie Ihre Antwort als Antwort auf den Kommentar von Ingo Bürk bearbeitet haben, um die "anonyme Funktion" tatsächlich anonym zu machen.
Dave Burton
3

@ Chris S gab ein schönes Beispiel, das den praktischen Unterschied (und die Gefahr) zwischen varund nein zeigt var. Hier ist eine andere, ich finde diese besonders gefährlich, da der Unterschied nur in einer asynchronen Umgebung sichtbar ist, so dass er beim Testen leicht vorbeigehen kann.

Wie zu erwarten, die folgenden Snippet-Ausgaben ["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

So auch das folgende Snippet (beachten Sie das fehlende letvorher array):

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

Das asynchrone Ausführen der Datenmanipulation führt immer noch zu demselben Ergebnis mit einem einzelnen Executor:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

Aber verhält sich bei mehreren anders:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

Verwenden Sie jedoch:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

Das ist mein Design
quelle
Danke für das Beispiel @thisismydesign! Warum protokolliert das vorletzte Beispiel in Bezug auf die letzten beiden Beispiele ein Array von 3 Elementen mit dreimal geschriebenem Text, während das ultimative Beispiel "Text" nur einmal pro Element innerhalb des Arrays protokolliert? (Ich verstehe, dass das letzte "Array" als Variable deklariert und sich daher im lokalen Bereich befindet, während das vorletzte Beispiel dies weglässt und "Array" zu einem Teil des implizierten globalen Bereichs macht.) Aber warum wirkt sich dies auf das aus? Ausgabe? Liegt es daran, dass das forEach "i" die Funktion und alle globalen Variablen durchläuft?
Fast Pitt
2

Als jemand, der versucht, dies zu lernen, sehe ich das so. Die obigen Beispiele waren für einen Anfänger vielleicht etwas zu kompliziert.

Wenn Sie diesen Code ausführen:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

Die Ausgabe lautet wie folgt: false, false, true, true

Weil die Variablen in der Funktion als von denen außerhalb der Funktion getrennt angesehen werden, daher der Begriff lokale Variable, und dies lag daran, dass wir var in der Zuweisung verwendet haben. Wenn Sie die Variable in der Funktion entfernen, lautet sie jetzt wie folgt:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

Die Ausgabe ist falsch, falsch, falsch, falsch

Dies liegt daran, dass anstatt eine neue Variable im lokalen Bereich oder in der lokalen Funktion zu erstellen, einfach die globalen Variablen verwendet und sie false zugewiesen werden.

Danrex
quelle
2

Ich sehe, dass Leute verwirrt sind, wenn sie Variablen mit oder ohne var und innerhalb oder außerhalb der Funktion deklarieren . Hier ist ein tiefes Beispiel, das Sie durch diese Schritte führt:

Sehen Sie das Skript unten in Aktion hier bei jsfiddle

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

Fazit

  1. Unabhängig davon, ob mit oder ohne var (wie a, b) deklariert wird, wenn sie ihren Wert außerhalb der Funktion erhalten, behalten sie ihren Wert bei, und auch alle anderen Werte, die innerhalb verschiedener Funktionen durch das Skript hinzugefügt werden, bleiben erhalten.
  2. Wenn die Variable innerhalb einer Funktion (wie c) ohne var deklariert wird, verhält sie sich wie die vorherige Regel und behält von nun an ihren Wert für alle Funktionen bei. Entweder hat es seinen ersten Wert in der Funktion testVar1 () erhalten, es behält den Wert bei und erhält einen zusätzlichen Wert in der Funktion testVar2 ()
  3. Wenn die Variable nur innerhalb einer Funktion mit var deklariert wird (wie d in testVar1 oder testVar2), ist sie bei jedem Ende der Funktion undefiniert. Es wird also eine temporäre Variable in einer Funktion sein.
Tarik
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, ein Beispiel zu erstellen, um dieses Thema zu demonstrieren. Im obigen Code fehlt der folgende Teil, daher möchten Sie möglicherweise Ihre Antwort bearbeiten: a = 1; // Außerhalb der Funktion ohne var definiert var b = 1; // Außerhalb der Funktion mit var alert definiert ("Außerhalb aller Funktionen starten ... \ n \ na, b definiert, aber c, d noch nicht definiert: \ na: "+ a +" \ nb: "+ b +" \ n \ n (Wenn ich versuche, den Wert des undefinierten c anzuzeigen oder d, console.log würde den Fehler 'Uncaught ReferenceError: c is not defined' auslösen und das Skript würde nicht mehr ausgeführt!) ");
Sankofa
1

Wenn Sie in einem Code eine Variable verwenden, ohne var zu verwenden, wird automatisch der var var_name in den globalen Bereich eingefügt, z.

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}
Akash Arora
quelle
1

Neben dem Thema Scopes erwähnen einige Leute auch das Heben , aber niemand gab ein Beispiel. Hier ist eine für den globalen Geltungsbereich:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";

Deathangel908
quelle
0

Ohne Verwendung von "var" können Variablen nur definieren, wenn ein Wert festgelegt wird. Zum Beispiel:

my_var;

kann nicht im globalen oder einem anderen Bereich arbeiten . Es sollte einen Wert haben wie:

my_var = "value";

Auf der anderen Seite können Sie ein vaiable like definieren;

var my_var;

Sein Wert ist undefined(Sein Wert ist nicht nullund es ist nicht gleich nullinteressant.).

umut
quelle
my_var;ist eigentlich eine gültige Ausdrucksanweisung.
Lexicore
Es ist eine gültige Anweisung, wenn die Variable zuvor definiert wurde. Andernfalls wird der Fehler "... ist nicht definiert" ausgegeben.
Umut
3
Es ist eine gültige Anweisung, unabhängig davon, ob zuvor eine Variable definiert wurde oder nicht. :) Eine gültige Anweisung kann einen Fehler auslösen, der die Anweisung nicht ungültig macht.
Lexicore
Ich bin verwirrt darüber. Was ist eine gültige Aussage? Und können Sie mir ein ungültiges Anweisungsbeispiel geben?
Umut
Ich muss mich entschuldigen - zu viel ECMAScript-Grammatik in letzter Zeit. my_var;ist eine gültige Ausdrucksanweisung . /my_var;wäre eine ungültige Aussage. Aber wie gesagt, das ist Grammatik-Kasuistik, ich entschuldige mich, mein Kommentar war eigentlich nicht angebracht.
Lexicore
0

Sie sollten das Schlüsselwort var verwenden, es sei denn, Sie möchten, dass die Variable im Browser an das Fensterobjekt angehängt wird. Hier ist ein Link, der das Scoping und den Unterschied zwischen glokalem Scoping und lokalem Scoping mit und ohne var-Schlüsselwort erklärt.

Wenn Variablen ohne Verwendung des Schlüsselworts var definiert werden, sieht es nach einer einfachen Zuweisungsoperation aus.

Wenn der Wert einer Variablen in Javascript zugewiesen wird, versucht der Interpreter zunächst, die „Variablendeklaration“ im selben Kontext / Bereich wie die Zuweisung zu finden. Wenn der Interpreter ausgeführt wird dummyVariable = 20, sucht er zu Beginn der Funktion nach der Deklaration von dummyVariable. (Da alle Variablendeklarationen vom Javascript-Interpreter an den Anfang des Kontexts verschoben werden und dies als Heben bezeichnet wird)

Vielleicht möchten Sie auch das Heben in Javascript betrachten

Simran Kaur
quelle