Eén functie die de lokale variabele van een andere functie verandert?

Ik had een probleem met sommige JavaScript-functies waarbij ik ongeveer een uur lang mijn hoofd krabde tot een goed geplaatste waarschuwing() iets openbaarde dat me verraste. Eén functie veranderde de lokale variabelen van een andere functie, zo lijkt het. Ik schreef een eenvoudig testscript:

function first() {
    msg = "1111";

    second();

    alert(msg);
    }


function second() {
    msg = "2222";
    }

Wanneer ik eerst() bel, zou ik een waarschuwingsvenster verwachten met "1111", maar in plaats daarvan krijg ik "2222". Hoe komt het dat de tweede() een lokale variabele beïnvloedt die bij first() hoort? Mis ik iets of is dit een fout?

Ik gebruik Firefox 12.0.

3
developer.mozilla.org/en/JavaScript/Guide/… (de hele gids is de moeite van het lezen waard als u JavaScript voor het laatst gebruikt)
toegevoegd de auteur Felix Kling, de bron
Dat is niet lokaal zonder var msg ... binnen de functies.
toegevoegd de auteur Jared Farrish, de bron
Vroeger was ik echt in de war door variabele reikwijdte, en toen leerde ik om zwijgen en gek op de sluitingsscope .
toegevoegd de auteur Jared Farrish, de bron

1 antwoord

De variabele is alleen lokaal als de var-instructie wordt gebruikt:

var msg = "1111";

Anders ontsnapt de waarde naar de globale scope.

5
toegevoegd
Niet kieskeurig, maar de "1111" en "2222" zijn ook een beetje vreemd.
toegevoegd de auteur Jared Farrish, de bron
Zie het als zonder de var om de variabele te declareren, er wordt van uitgegaan dat de variabele aanwezig is in de globale scope.
toegevoegd de auteur matt3141, de bron
Haha, in verschillende jaren aan en uit met JavaScript (ik doe het voor hobby niet voor werk) dit had me tot nu toe volledig ontweken. Ik heb var geplaatst voor msg = ... en het werkt zoals verwacht. Bedankt!
toegevoegd de auteur Iain, de bron