JavaScript实现词法作用域吗?

9
为什么这个返回2而不是1?似乎第二个“var”被静默忽略了。
function foo()
{
  var local = 1;
  {
    var local = 2;
  }
  return local;
}
foo()
/*
2
*/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let - Arun P Johny
2个回答

6
在JavaScript中,只有函数级作用域和全局作用域。您无法创建块级作用域,它不会增加任何特殊含义,也不会创建任何作用域。
这就是您的代码最终呈现的方式。
function foo()
{
  var local = 1;
  local = 2;
  return local;
}
foo();

在ES6中,你可以用Let帮助创建块级作用域。但是ES6尚未得到支持,更多信息请参考此处


2
需要注意的是,词法作用域将在ES6 let关键字中很快出现。 - Capaj

3

来自MDN

JavaScript没有块级作用域;相反,在块内声明的变量仅在包含该块的函数(或全局作用域)中为局部变量。

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

你的代码等效于

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

注意,ES6(JavaScript的新规范)确实引入了使用let进行词法作用域,但它目前还不是真正可用的

它适用于Firefox和Node.js Harmony。 - simonzack
1
@simonzack,你没注意到我链接了Kangax表格吗?除非OP在编写服务器端代码,否则他不能承受与IE和Chrome不兼容的风险,这就是为什么我说“不太可用”。 - Denys Séguret
啊,我明白了,我没有点击你的链接。 - simonzack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接