Javascript关闭:它如何记住环境?

时间:2014-09-13 13:16:43

标签: javascript closures

1。)闭包是一种特殊的对象,它结合了两个东西:一个函数,以及创建该函数的环境环境包含在创建闭包时在范围内的任何局部变量

2。)闭包中定义的函数'记住'

。创建它的环境

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

我的问题 关闭如何记住创建它的环境(我的意思是它必须保存在某个地方,但是如何以及?? ??。

还有更多,如果有模块化模式(使用闭包来模拟私有和公共范围),就像这样

var Module = (function () {
  var privateMethod = function () {

  };
  return {
    publicMethod1: function () {
      // has access to `privateMethod`, we can call it:
      // privateMethod();
    },
    publicMethod2 : function(){
      //another public method
    }

  };
})();

所以在这种情况下 publicmethod1和publicmethod2 在上面的情况记住整个环境 ??

1 个答案:

答案 0 :(得分:3)

  

我的问题是闭包如何记住创建它的环境(我的意思是它必须保存在某个地方,但是如何以及在哪里?)。

它是为闭包创建的函数对象的一部分。一个属性(您无法访问),该属性引用了规范所称的执行上下文绑定对象,其中创建了该函数。该绑定对象是保存该特定执行上下文(调用包含函数)的所有变量(以及其他类似变量的东西,例如函数参数)的地方。

绑定对象也引用了包含 it 的环境的绑定对象;这被称为“范围链”。

当您查找变量引用时,引擎首先查看开头(最里面)范围内的绑定对象。如果它有变量,它就会被使用;如果没有,则使用下一个绑定对象out,依此类推,直到达到全局范围。

更多(在我的博客上)Closures are not complicated

  

...在上面的例子中,publicmethod1和publicmethod2都记得整个环境吗?

它们都引用了相同的绑定对象,即通过调用匿名函数创建的绑定对象。假设代码出现在全局范围内,则该绑定对象具有对全局绑定对象的引用。 (这是我们可以直接访问的唯一绑定对象:它是全局对象,在全局上下文中可以作为this访问,在非严格代码中调用this而没有显式this,并通过浏览器上的全局变量window。)

一些ASCII艺术:

      +---------------------------------------------------------------------------------------+
      |                                                                                       |
      v                                                                                       |
+---------------+                                                                             |
| global object |                                                                             |
+---------------+     +---------------+                                                       |
| Module        |---->|    Object     |                                                       |
| ...           |     +---------------+     +-------------+                                   |
+---------------+     | publicMethod1 |---->|   Function  |                                   |
                      | publicMethod1 |--+  +-------------+                                   |
                      +---------------+  |  | (reference) |--+                                |
                                         |  +-------------+  |                                |
                                         |                   |                                |
                                         |                   |    +------------------------+  |
                                         |                   +-+->| DeclarativeEnvironment |  |
                                         |  +-------------+  | |  +------------------------+  |
                                         +->|   Function  |  | |  | (scope chain link)     |--+  +-------------+
                                            +-------------+  | |  | privateMethod          |---->|   Function  |
                                            | (reference) |--+ |  +------------------------+     +-------------+
                                            +-------------+    |                                 | (reference) |--+
                                                               |                                 +-------------+  |
                                                               |                                                  |
                                                               +--------------------------------------------------+