Vraag Wat is het doel van het var-zoekwoord en wanneer moet ik het gebruiken (of weglaten)?


NOTITIE: Deze vraag is gesteld vanuit het oogpunt van ECMAScript versie 3 of 5. De antwoorden kunnen verouderd raken door de introductie van nieuwe functies in de release van ECMAScript 6.


1389
2017-09-24 08:54


oorsprong


antwoorden:


Als u zich in de mondiale scope bevindt, is er geen verschil.

Als je dan in een functie zit var zal een lokale variabele maken, "no var" zal de scope-keten opzoeken tot hij de variabele vindt of de globale scope raakt (op welk moment hij deze zal creëren):

// 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
    }())
}

Als je geen opdracht aan het doen bent, moet je gebruiken var:

var x; // Declare x

1254
2017-09-24 08:55



Er is een verschil.

var x = 1  verklaart variabele  x in het huidige bereik (aka uitvoeringscontext). Als de aangifte in een functie verschijnt - wordt een lokale variabele gedeclareerd; als het een globaal bereik heeft - een globale variabele wordt gedeclareerd.

x = 1, aan de andere kant, is slechts een eigenschapstoekenning. Het probeert eerst op te lossen x tegen scoopketen. Als het ergens in die bereikketen wordt gevonden, voert het toewijzing uit; als het niet vindt x, alleen dan het creëert x eigenschap op een globaal object (dit is een object van het hoogste niveau in een scope-keten).

Merk nu op dat het geen globale variabele declareert, het creëert een globaal eigendom.

Het verschil tussen de twee is subtiel en kan verwarrend zijn, tenzij je dat begrijpt variabele declaraties creëren ook eigenschappen (alleen op een variabel object) en dat elke eigenschap in Javascript (wel, ECMAScript) bepaalde vlaggen heeft die hun eigenschappen beschrijven - ReadOnly, DontEnum en DontDelete.

Aangezien variabele declaratie een eigenschap maakt met de vlag DontDelete, is het verschil tussen var x = 1 en x = 1 (indien uitgevoerd in een globale scope) is dat de vorige - variabele declaratie - de eigenschap DontDelete'able creëert, en de laatste niet. Als gevolg hiervan kan de eigenschap die via deze impliciete toewijzing is gemaakt, vervolgens uit het globale object worden verwijderd en kan de vorige - de variabele die is gemaakt via variabele declaratie - niet worden verwijderd.

Maar dit is gewoon de theorie natuurlijk, en in de praktijk zijn er zelfs nog meer verschillen tussen de twee, vanwege verschillende bugs in implementaties (zoals die van IE).

Ik hoop dat het allemaal zinvol is:)


[Update 2010/12/16]

In ES5 (ECMAScript 5, recent gestandaardiseerde, 5e editie van de taal) is er een zogenaamde "strikte modus" - een opt-in-taalmodus, die het gedrag van niet-aangegeven toewijzingen enigszins verandert. In strikte modus is toewijzing aan een niet-opgegeven ID een ReferenceError. De reden hiervoor was om toevallige toewijzingen te vangen, waardoor het ontstaan ​​van ongewenste globale eigenschappen werd voorkomen. Sommige van de nieuwere browsers zijn al begonnen met het rollen van ondersteuning voor de strikte modus. Zie bijvoorbeeld mijn compat tafel.


695
2017-09-24 13:38



Zeggen dat het het verschil is tussen "lokaal en globaal"is niet helemaal correct.

Het is misschien beter om het te zien als het verschil tussen "lokaal en dichtstbijzijnde"Het dichtstbijzijnde kan zeker mondiaal zijn, maar dat zal niet altijd het geval zijn.

/* 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;
    }
}

130
2017-09-24 09:50



Wanneer Javascript in een browser wordt uitgevoerd, wordt al uw code omgeven door een met-instructie, zoals:

with (window) {
    //Your code
}

Meer info over with - MDN

Sinds var verklaart een variabele in de huidige scope er is geen verschil tussen declareren var  binnen venster en het helemaal niet verklaren.

Het verschil komt als je niet direct in het raam zit, bijvoorbeeld binnen een functie of in een blok.

Gebruik makend van var laat je externe variabelen verbergen die dezelfde naam hebben. Op deze manier kun je een "private" variabele simuleren, maar dat is een ander onderwerp.

Een vuistregel is om altijd te gebruiken var, omdat je anders het risico loopt om subtiele bugs te introduceren.

BEWERK: Na de kritieken die ik heb ontvangen, wil ik het volgende benadrukken:

  • var verklaart een variabele in de huidige scope
  • Het wereldwijde bereik is window
  • Niet gebruiken var verklaart impliciet var in de globale scope (venster)
  • Een variabele in de globale scope (venster) declareren met var is hetzelfde als het weglaten ervan.
  • Een variabele in scopes declareren die afwijkt van het gebruik van het venster var  is niet hetzelfde als een variabele declareren zonder var
  • Verklaar altijd var expliciet omdat het een goede gewoonte is

76
2017-09-24 09:17



Je zou moeten altijd gebruik de var sleutelwoord om variabelen te declareren. Waarom? Een goede codeermethode zou op zich al een reden moeten zijn, maar een variabele declareren zonder de var sleutelwoord betekent dat het is gedeclareerd in de globaal bereik (een variabele als deze wordt globaal een "impliciet" genoemd). Douglas Crockford raadt aan nooit geïmpliceerde globals te gebruiken, en volgens de Richtlijnen voor codering van Apple JavaScript:

Elke variabele gemaakt zonder de var   sleutelwoord wordt gemaakt op de globale reikwijdte   en wordt geen garbage verzameld wanneer het   functie retourneert (omdat dit niet het geval is   ga buiten bereik), presenteer de   kans op een geheugenlek.

Kortom, verklaar altijd variabelen met behulp van de var trefwoord.


37
2017-09-24 09:52



Hier is een aardig goed voorbeeld van hoe je verstrikt kunt raken in het niet declareren van lokale variabelen var:

<script>
one();

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

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

(i wordt opnieuw ingesteld bij elke iteratie van de lus, omdat deze niet lokaal wordt aangegeven in de for loop maar globaal) uiteindelijk resulterend in een oneindige lus


27
2017-09-24 09:31



Ik zou zeggen dat het beter is om te gebruiken var in de meeste situaties.

Lokale variabelen zijn altijd sneller dan de variabelen in de wereldomvang.

Als je het niet gebruikt var om een ​​variabele te declareren, heeft de variabele een globaal bereik.

Voor meer informatie kunt u zoeken in "scope chain JavaScript" in Google.


12
2017-09-24 09:02