Kolla de senaste inläggen:

För någon månad sedan hade jag en föreläsning om lite mer avancerad javascript där vi bland annat tittade på möjligheterna att använda privata, publika, statiska och priviligerade metoder och egenskaper i javascript. Vidare gick vi igenom hur viktigt det i javascript är att veta i vilken context vår kod exekverar, eller vilket objekt som har scope. Det är möjligt att jag utvecklar detta lite närmre i kommande artiklar men jag tänke nu förklara skillnaden (som faktiskt är ganska stor) på följande rader kod:

function myFunction() {
   var n = 0;
   var m = 0;
}

gentemot följande kod:

function myFunction() {
   var n = m = 0;
}

I många andra språk är ovanstående helt synonyma men inte i javascript. Anledningen är skillnaden mellan att deklarera variabler med eller utan nyckelordet var.

Om vi i en funktion deklarerar en variabel genom att skriva:

function myFunction() {
   var n = 0;
}

så kommer n att skapas inuti funktionen myFunction (som är ett objekt när den exekveras) . Detta innebär i praktiken att vi inte kan komma åt variabeln n utanför funktionen myFunction.

Deklarerar vi istället lite slarvigt vår variabel på följande sätt (vilket man inte ser allt för sällan):

function myFunction() {
   n = 0;
}

så kommer nu variabeln n inte att skapas i vår funktion myFunction utan som en ”global variabel”. Globala variabler i javascript innebär att de egentligen blir egenskaper på window-objektet. Vi kan nu alltså komma åt vår variabel n utanför vår funktion genom att skriva window.n alternativt enbart n.

Att på detta sätt lägga våra tänkta funktionsvariabler direkt på windowobjektet är inte snygg kodpraxis och något vi definitivt vill undvika. Problem kan annars lätt uppstå om flera funktioner använder samma variabelnamn.

Åter till problemet med att deklarera variabler som var n = m = 0;. När man gör på detta sätt så innebär det i praktiken att följande kod exekveras:

function myFunction() {
   m = 0;
   var n = m;
}

Vi ser nu att n kommer att skapas på funktionen medan m skapas på window-objektet. Troligtvis var detta inte det som kodens skapare hade som intention.

Personligen så undviker jag rent allmänt att skapa flera variabler på samma rad, men jag har i några olika färdiga javascriptbibliotek sett detta angreppssätt, troligtvis för att minimera koden, men jag vill alltså varna för detta.

Hoppas att du lärt dig något nytt i och med denna artikel och troligtvis så kanske artikeln gav dig andra funderingar. ”Är funktioner objekt???” . Dessa är i så fall något jag får anledning att återkomma till.



  1. Tobias Jakobsson on onsdag 9, 2008

    Intressant läsning!

    Även om det inte är snyggt så ser jag direkt fördelar med att man iaf har möjlighet att skapa variabler på window-objektet vilket jag inte hade en aning om, tack :)

  2. mikko [wp07.net] on onsdag 9, 2008

    trevligt trevligt, ska bli intressant att följa denna blogg =)

  3. Sebastian Eliasson on onsdag 9, 2008

    Johan bloggar!:)

    Detta ”problem” tror jag inte att jag har stött på förut. Lösningen är väl att man först deklarerar dem sedan kan man tilldela dem alla samma värde på en gång:

    function myFunction()
    {
    var n, m;
    n = m = 0;
    }

    Intressant!