Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does javascript implement lexical scoping? [duplicate]

Why does this return 2 instead of 1? Seems the second "var" is silently ignored.

function foo()
{
  var local = 1;
  {
    var local = 2;
  }
  return local;
}
foo()
/*
2
*/
like image 394
Zdeněk Pavlas Avatar asked Nov 12 '14 08:11

Zdeněk Pavlas


Video Answer


2 Answers

In javascript there is only function level scope and global scope. you cannot create a block scope and it adds no special meaning and does not create any scope.

And this is how your code ends up

function foo()
{
  var local = 1;
  local = 2;
  return local;
}
foo();

In ES6 you can create block level scopes with the help of Let. ES6 is not supported yet. more on that here

like image 106
Prabhu Murthy Avatar answered Nov 03 '22 01:11

Prabhu Murthy


From the MDN :

JavaScript does not have block statement scope; rather, a variable declared within a block is local to the function (or global scope) that the block resides within.

The scope of a variable in JavaScript is the whole function in which it is declared (or the global scope), so you only have one variable local here.

Your code is equivalent to

function foo()
{
  var local;
  local = 1;
  {
    local = 2;
  }
  return local;
}
foo()

Note that ES6 (the new norm of JavaScript) does introduce a lexical scoping with let but it's not yet really available.

like image 33
Denys Séguret Avatar answered Nov 03 '22 01:11

Denys Séguret