Contents
一种定义是:
A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression).
我的理解是: closure 是一个表达式(通常是一个函数), 这个表达式与一个 环境 共享着一些自由变量, 而这个 环境 则 绑定 着那些自由变量(或者说 结束 这个表达式, 这也是所谓closure 的名字由来). 所谓的 环境 就是一个更大的block, 所有的自由变量在这个 block 中 声明(有意义). 而 绑定 也就是指这些自由变量的作用域就是这个环境.
举个简单的例子.
var flag = false; //调试开关 // env 既是所谓的环境 // 而inner就是所谓的表达式, name即是所谓的自由变量 function env() //整个env可以看作是一个closure { var name = "zhutao"; function inner() { return name + " is a student."; } return inner; //返回的是一个内部函数 }//closure结束 flag = true; if (flag) { // 此处是最神奇的地方, 代码执行在此处, inner函数其实已经出了env的body, // 而仍然能够被引用, 这就是所谓形成了一个 closure var inner_func_ref = env(); // 这时候inner_func_ref引用的就是inner()函数对象 alert(inner_func_ref()); // zhutao is a student. }
而在上面的例子中, 函数env就是所谓的定义中的 环境, 函数inner就是定义中所谓的 表达式, 而name即是所谓的 自由变量, 绑定 在env这个 环境 中. env的结束也即closure的结束.
而在javascript中,如果内部函数出了自己的所在的外部函数的body仍然能够引用,则会形成所谓的closure.
在具体了解closure之前,我们需要了解一些其它的知识.
在 javascript 中,每行可执行的代码都具有一定的 执行空间, 如全局的执行空间, 函数的执行空间, 递归后的函数执行空间等. 而一个完整的 javascript 执行过程,可以看作是有一个执行空间栈 ,不断地 进行 执行空间 的变化(出栈,进栈).
这个是很重要的概念,这个概念的理解与本系列的将要完成的另一篇文章 this关键字 的理解也是密切相关的.
详细解释请参考即将完成的 this关键字 的博文.
执行空间可以理解为具有属性的对象集, 但是通常这些属性都不是可随意访问的, 而这些对象集为代码的执行 提供了一定的上下文(空间).
新闻热点
疑难解答
图片精选