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 在上面的情况记住整个环境 ??
答案 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) |--+ | +-------------+ | | | +--------------------------------------------------+