javascript - Komma åt variabel i if-block


var func = function () {
   var i: number = 0;
   if (i == 0) {
      var y: number = 1;
   }

   document.body.innerHTML = y.toString(); // js/ts should complain me in this line
};

func(); // output: 1

Som du kan se, har jag deklarerat variabeln y inuti if-blocket. Så jag tror att den inte kan refereras utanför dess omfång.

Men när jag har försökt köra koden blir resultatet 1.

Är det ett problem i TypeScript/JavaScript?

Svar #1

Variabler i Javascript hoistas, vilket betyder att var y flyttas till toppen av funktionen som om den hade deklarerats där.

Initialisering, däremot, lyfts inte, så om du ändrar i till något annat än 0, kommer variabeln y fortfarande att existera, men den kommer att ha värdet undefined.

Detta innebär att funktionen är exakt motsvarande:

var func = function () {
   var i: number = 0;
   var y: number;
   if (i == 0) {
       y = 1;
   }

   document.body.innerHTML = y.toString(); // js/ts should complain me in this line
};

För att få det beteende du förväntar dig, behöver du använda let, som är en del av ECMAScript 2015 (ES6). Det är block-scope:at, precis som du förväntar dig. Det kommer också effektivt att fungera så att det endast är tillgängligt från och med punkt för definition, vilket förmodligen också är som du skulle förvänta dig.

Svar #2

Om du deklarerar om en JavaScript-variabel kommer den inte att förlora sitt värde.

Den andra referensen kan bana väg för en ny variabelsyntax. Faktiskt om du minns är variabeldeklaration inte nödvändig i JavaScript. Enkel

y=1;

fungerar också.

Den andra gången du refererar till y, utanför if-blocket, försöker det enligt min åsikt en ny deklaration och behåller det gamla värdet.

Referens - http://www.w3schools.com/js/js_variables.asp & http://www.w3schools.com/js/js_scope.asp