关于局部变量:javascript实现lexical scoping吗?

Does javascript implement lexical scoping?

本问题已经有最佳答案,请猛点这里访问。

为什么返回2而不是1?似乎第二个"var"被悄悄地忽略了。

1
2
3
4
5
6
7
8
9
10
11
12
function foo()
{
  var local = 1;
  {
    var local = 2;
  }
  return local;
}
foo()
/*
2
*/


在javascript中,只有函数级作用域和全局作用域。不能创建块范围,它不添加任何特殊含义,也不创建任何范围。

你的代码就是这样结束的

1
2
3
4
5
6
7
function foo()
{
  var local = 1;
  local = 2;
  return local;
}
foo();

在ES6中,您可以在let的帮助下创建块级作用域。尚不支持ES6。这里有更多的内容


从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.

javascript中变量的作用域是声明它的整个函数(或全局作用域),因此这里只有一个变量local

您的代码等价于

1
2
3
4
5
6
7
8
9
10
function foo()
{
  var local;
  local = 1;
  {
    local = 2;
  }
  return local;
}
foo()

请注意,ES6(新的javascript规范)确实引入了使用let的词汇范围,但它还没有真正可用。