【问题标题】:What is the Javascript [[Environment]] Property?什么是 Javascript [[Environment]] 属性?
【发布时间】:2018-08-08 13:36:03
【问题描述】:

我正在阅读Secrets of the Javascript Ninja 并试图找出函数的闭包变量的存储位置。[[Environment]] 函数标识符上可用的属性:

每当创建一个函数时,都会引用它所在的词法环境 创建的函数存储在内部(意味着您无法访问或操作它 直接)名为 [[Environment]] 的属性(这是我们将用来标记这些的符号 内部属性)。在我们的例子中,skulk 函数将保持对全局的引用 环境,以及对 skulk 环境的报告功能。

我在函数中看到的只是[[Scopes]],其中包含闭包范围:

|

我有两个问题:

  1. [[Environment]] 是 Node.js 的东西,相当于前端的 [[Scopes]]
  2. 这是检查函数的任何闭包数据的最佳位置吗?

【问题讨论】:

  • 1) 这可能是特定于浏览器的。例如,IE 甚至不显示这些范围。但是由于 chrome 中的这个 [[Scopes]] 对象符合 [[enviroment]] 的描述,我会假设它们是相同的并且 [[Scopes]] 是 Chrome 实现。 2) 不知道,我从来没有遇到过这样的情况:检查函数的封闭变量的存储位置比检查封闭变量的值更重要。
  • 规范文本中描述的[[environment]] 是一个链表。屏幕截图中的[[scopes]] 看起来更像一个数组。
  • 正如你的书所说,它不是一个属性。这是一个internal slot(以前称为internal property)。您无法访问它,也无法在函数上“检查闭包数据”。这只是您的调试器的礼貌,使其可供检查。
  • @Bergi 你从哪里得到规格列表?
  • @VSO ecma-international.org/ecma-262。不过,我不能向初学者推荐它

标签: javascript closures


【解决方案1】:

看起来 [[Scope]] 是 [[Environment]] 的旧名称; here

Set F.[[Environment]] to Scope.

虽然 ES5 文档称它为 [[Scope]]; here

Set the [[Scope]] internal property of F to the value of Scope.

【讨论】:

    【解决方案2】:

    1 : [[Environment]] 是 Node.js 的东西,相当于前端的 [[Scopes]] 吗?

    嗯... 我认为这个问题是错误的。因为两者都是在创建执行上下文的阶段创建的。

    而且我认为[[Environment]][[Scope]] 完全不同。

    [[Scope]] 包含一个变量列表,可以在一定范围内访问,从而可以搜索(范围链)变量。

    [[Environment]] 知道词法环境。另外,这是我的想法(不要太相信,因为它可能是错误的),因为有一个Environment,我认为你可以使用闭包。因为它指的是外部的词法环境。

    2 : 这是检查函数的任何闭包数据的最佳位置吗?

    是的。正如我在步骤 1 中所说,我认为检查函数的闭包数据是合适的,因为它引用了一个比自身更大的外部词法环境。

    希望我的意见对你有很大帮助。如果这是错误的,请发表评论。

    我会推荐这些网站。看一看。 here1here2

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2018-04-30
      • 2012-03-12
      • 2017-10-19
      • 2014-09-02
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多