JavaScript闭包的定义以及自己的理解

在MDN上面有这么一句话:函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。而我自己的理解,闭包相对于其他形式的函数来说多了一个独立的作用域用来存储相对于全局作用域隔离的信息(最常见的就是变量),且这个独立的作用域不会像其他函数一样随着函数执行完毕而销毁。

首先看一段例子:

function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}
 
var f1 = Foo();
console.dir(f1);

执行完上述代码之后,返回f1这个函数的详细信息,审查里面的作用域,发现除了全局作用域之外还有一个闭包作用域,而i的值是储存在闭包作用域中的。

如果是一个普通的函数,一般只会存在全局作用域,定义在函数内的变量无法通过这种方式查看,因为普通函数的局部变量在函数运行之时才创建,运行完毕立刻销毁。如果想要通过审查的方式来窥视函数内部的作用域,可以通过在chrome浏览器的审查元素中设置断点来获取JS执行中的函数局部变量(设置断点的方法看这里

我们运行两次f1函数,然后再审查一次f1

f1();
f1();
console.dir(f1);

不难发现,定义在闭包作用域中的i变量从0自增到了2

刚刚上面提到的内容其实上类似于JS的计数器难题

所以,上述例子中,闭包就是由函数(函数是这个 function() {console.log(i++);} )以及该函数的独立作用域(也可以叫做词法环境,上图中用红方框框住的Closure就是)组成

也可以说f1就是闭包

发表评论

电子邮件地址不会被公开。 必填项已用*标注