共计 576 个字符,预计需要花费 2 分钟才能阅读完成。
1. 什么是闭包?闭包的特点是什么?
闭包是一个函数,不过这个函数是声明在另外一个函数内部的,可以读取另外一个函数内部的变量。闭包其实非常常见,只不过可能我们很少意识到,这就是闭包。
闭包最大的特点就是可以记住自己的诞生环境,无论在何处调用,访问的都是声明时作用域的变量,可以访问到父函数中的变量, 比如:
function fn1() {
var b=234;
function fn2() {console.log(b);
}
return fn2;
}
var fn2=fn1();
fn2();//234
此时,fn2
就是一个闭包函数,由于 js 中是的作用域是词法作用域,即函数的作用域是由函数的声明位置确定的,所以 fn2
在fn1
中声明的时候,它的作用域和作用域链就确定了,当 fn2
执行时,创建执行环境时,会根据作用域链向上逐级查找变量,最终在 fn1
中找到变量 b,这就是为什么在外部调用 fn2
时,能够输出 fn1
中b
的值,也是为什么说闭包函数可以记住自己的诞生环境。
2. 闭包函数的注意点
一般函数在执行完成后,其中的变量没有再被使用,内存就会被回收,
但是在闭包函数中,由于全局中的 fn2
一直被引用,所以 fn1
也不会被回收,变量 b
也会留在内存中。
因此,为了避免这种内存不被回收的问题,我们在使用完闭包函数 fn2
之后,要将闭包函数置空,切断引用关系,以实现回收 fn1
内存的目的
fn2=null;
正文完
发表至: javascript
2020-05-29