【问题标题】:Does javascript implement lexical scoping? [duplicate]javascript 是否实现词法作用域? [复制]
【发布时间】:2015-01-09 00:14:40
【问题描述】:

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

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

【问题讨论】:

标签: javascript local-variables


【解决方案1】:

来自the MDN

JavaScript 没有块语句范围;而是一个变量 在块中声明的对于函数(或全局范围)来说是本地的 该块位于其中。

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

你的代码相当于

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

请注意,ES6(JavaScript 的新规范)确实引入了 lexical scoping with letit's not yet really available

【讨论】:

  • Firefox 和 nodejs 和谐可用。
  • @simonzack 你没注意到我链接到 Kangax 表吗?除非 OP 在服务器端编码,否则他真的无法承受与 IE 和 Chrome 不兼容的代价,这就是为什么我说“不可用”。
  • 啊,我明白了,我没有点击你的链接。
【解决方案2】:

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

这就是你的代码的最终结果

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

在 ES6 中,您可以借助 Let 创建块级作用域。 ES6 还不支持。更多关于here

【讨论】:

  • 需要注意的是,词法作用域将在不久的将来与 ES6 let 关键字一起出现。
猜你喜欢
  • 2011-01-23
  • 2016-12-25
  • 2018-06-25
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多