JavaScript闭包函数
前言
闭包(closure)是 JavasSript 的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
在JavaScript中使用闭包函数
1.我们首先要知道什么是闭包函数?它的作用是什么?
2我们又该如何判断闭包函数?
3.闭包函数的优缺点是什么?
4.闭包函数又存在哪些问题?
一、闭包函数及其作用
认识闭包函数
闭包函数,通俗一点来讲就是可以在函数外部访问到函数内部的变量,通常就是函数嵌套函数的结构,这是形成闭包的其一必要条件。另外,作为闭包的重要条件之一,内部函数应该访问外部函数中声明的私有变量,参数,或者其他内部函数。满足上述两种必要条件,此时外部函数外调用内部函数,它就会成为一个闭包函数。
闭包函数的作用
列一些简单的小例子
1.我们在性能优化的过程中,使用节流防抖函数就是闭包原理,导航栏获取下标的使用。
2.项目后期的时候进行了一定的性能优化。比方说:对级联菜单的功能适用房都节流的方式,减少了HTTP请求。等一些操作
二、如何表象判断是不是闭包函数
- 函数是不是嵌套结构,就比如在一个函数中再定义一个函数的这种嵌套格式,内部函数被return
- 所定义的内部函数可以调用外部函数的局部变量
function a(){
let j = 10
let i = 10
console.log(i+j); //打印20
//初始化b
let b = function(){
//里面的方法,用到了外面方法定义的变量
//所以,i会一直存在于内存中
//这样的函数,我们又称之为:闭包函数
i += 5
console.log(i);
console.log('HelloWorld');
}
//a方法,返回b,而b也是一个方法
//方法的返回值是方法,这样的方法:也称之为,高阶方法。
return b //返回b
}
let c = a()
c()
c()
三、闭包函数的优缺点
优点
1. 逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。
2. 方便调用上下文的局部变量。
3. 加强封装性,第2点的延伸,可以达到对变量的保护作用。
缺点
函数执行完毕后,函数内的局部变量没有释放,占用内存的时间会变长。或者说是闭包长时间驻留 内存,长期这样会导致内存泄露。
四、闭包函数所存在的问题及解决方式
内存泄露问题
出现内存泄露的原因主要有以下几点:
- 占用的内存没有及时释放
- 内存泄漏积累多了就容易导致内存溢出
常见的内存泄露:
-
意外的局部变量
-
没有及时清理的计时器或 回调函数(回调就是一个函数的调用过程。那么就从理解这个调用过程开始吧。函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调)
//这段代码会导致内存泄露
window.onload = function(){
var el = document.getElementById("id");
el.onclick = function(){
alert(el.id);
}
}
引用的变量可能发生变化
function onter() {
var result = []
for (var i = 0;i<10;i++){
result[i] = function () {
console.info(i) //因为每个闭包函数访问变量i是outer执行环境下的变量i,
//随着循环的结束,i已经变成10了,所以执行每个闭包函数,结果打印10,...,10
}
}
return result
}
function onter() {
var result = []
for (var i = 0; i<10;i++){
result[i] = (function (num) {
return function() {
console.info(num); // 此时访问的num,是上层函数执行环境的num,
//数组有10个函数对象,每个对象的执行环境下的number都不一样
}
})(i)
}
return result
}
以上就是一些我对于闭包函数内容的整理。