【问题标题】:let keyword - Dictionaries of Dictionaries data model让关键字 - 字典数据模型的字典
【发布时间】:2017-09-08 21:13:19
【问题描述】:

此查询与存储结构有关,但不了解let关键字的范围规则。


使用var关键字,awindow对象的一个​​属性(就像字典一样)

var a = 10;
console.log(window.a); // 10
console.log(window['a']) // 10

fwindow对象的属性

function f(){}

console.log(window['f']) // function object

使用let关键字,b不是window字典的属性

let b = 20;
console.log(window.b); // undefined

我的理解是,在 JavaScript 代码中引入的任何 name(function/var/..) 都将是 windowdictionary(nested) 对象的属性(成员)。

编辑:


b 是谁的财产?

【问题讨论】:

  • 我的理解是,在 JavaScript 代码中引入的任何名称(函数/var/..)都将是窗口字典(嵌套)对象的属性(成员)。 和, 那就是问题所在。这种说法是不正确的。请参阅下面的答案。
  • @ScottMarcus 在该屏幕截图中b 是谁的财产?查询已编辑
  • 如下回答。 b 属于全局范围。但是,由于使用let 来声明b,它的作用域是一个具有全局作用域的特殊隐藏对象。您期望所有 Globals 都必须成为 window 的属性是不正确的,这就是您困惑的根源。

标签: javascript dictionary ecmascript-6


【解决方案1】:

您提供的代码均与“字典”无关。

varlet 确定变量的范围。使用var,变量的作用域是它的包含函数(或全局作用域,如果在所有函数之外)。

let 给出了比函数级范围更细的变量块级范围(即if/else 语句的分支)。

如果声明在全局范围内,那么 letvar 不会有任何区别,因为范围是全局的。

两个声明都将创建全局变量,但 let 不会像 var 那样在 window 对象上显式创建命名属性。

详情请参阅this

同样来自MDN

let 允许您声明范围受限的变量 使用它的块、语句或表达式。这不像 var 关键字,它在全局范围内定义一个变量,或者在本地定义一个变量 整个函数与块范围无关。

而且,从 ECMAScript spec. 本身:

letconst 声明定义范围为 运行执行上下文的 LexicalEnvironment

var 语句声明了作用域为正在运行的变量 执行上下文的 VariableEnvironment

这就是为什么全局声明的let 变量不能通过window 访问,就像全局声明的var 变量一样。

【讨论】:

  • window 是一个字典数据结构
  • @overexchange 不,不是。 JavaScript 有对象,它们可以看作类似于字典,但全局声明的变量只是成为全局对象的属性。 window 是一个对象。全局范围内的 varlet 不会改变这一点。
  • @overexchange 不,我不是这么说的。请不要那么争论,你可能会学到一些东西。
  • @overexchange 你觉得你很粗鲁。即使您不同意 Scott 或认为他错了,与花时间回答您问题的人进行良好互动仍然是一种礼貌
  • @overexchange:一个全局环境由两部分组成:1)一个声明性环境记录,它基本上是一个内部数据结构,不能从用户空间代码访问。那是constletclass 和其他人居住的地方。它与函数中使用的环境相同。 2) object 环境记录,顾名思义,将所有绑定存储为对象的属性。该对象可在用户土地代码中访问(它是全局对象)。您可以在规范中了解更多信息:ecma-international.org/ecma-262/8.0/…
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多