今天记录一下JS中有关闭包的部分,如果有不对的地方,欢迎留言!
闭包的定义
一个可以访问其他函数内部变量的函数。
定义是标准的总结,需要各位牢记。
闭包的概念
闭包是JS中的一个难点,最简单的写法是,一个函数中返回另一个函数,如下所示:
// 示例1
function fn1() {
var a = {};
retunn function fn2() {
}
}
var fn = fn1()
在上述的 ‘示例1’ 中,执行完函数 fn1 后,返回了一个函数 fn2,这种写法就是闭包,当然闭包也还有很多变化后的写法。
闭包的特性
- 存储变量——在 ‘示例1’ 中,函数 fn 是接收到的函数 fn2,如果在 函数fn中,每次都修改声明的变量 a,那么每次执行,修改的都是同一个变量
- 内存泄漏——因为闭包有做变量存储的特性,所以在函数不在使用之后,存储起来的变量还是会占用着一定的内存,并不会消失,所以会产生内存泄漏的问题。但是大部分情况下,并不会对程序造成很大的影响。
闭包的使用
在vue源码中有一种使用方式,用于判断当前的标签是否为原生标签。大概写法如 ‘示例2’。利用闭包封装了一个公共函数judge,后面根据这个函数生成了多个用于判断的函数。
// 示例2
function judge(cond) {
return function(cont) {
if(cond.indexOf(cont) !== -1) {
return true;
}
return false;
}
}
// 判断是否为标签
const judgeDom(['html','body','div','meta', ...])
// 判断是否为指定数字
const judgeNum([1,2,3, ...])