目录
闭包
闭包(closure)是什么?
闭包是js的一种语法特性。
闭包就是能够读取其他函数内部变量的函数
创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。——《JavaScript高级程序设计》
闭包是指有权访问另一个函数作用域中变量的函数,简单来说就是一个嵌套函数中引用了封闭函数定义的变量,并且该函数可以在其定义环境外即封闭函数外被执行。这样的嵌套函数我们称之为闭包。
往大了说,拥有作用域的被称为闭包,所有的函数都是闭包。闭包能经常在业务中看到,这与闭包的优点有关。
闭包的优点
保存:可以读取其他函数内部的变量,并将其一直保存在内存中。
保护:在闭包内的变量不会影响到外部的全局变量,避免了全局变量的污染。
二者的实现与作用域有关。
var a=5
var arr=[]
for(var i=0;i<5;i++){
(function fn(i,a=0){
a+=1
arr[i]=i
})(i)
}
console.log(a)
console.log(arr)
内存泄漏
闭包有好处,也会有其缺点:内存泄漏,这种情况的产生与垃圾回收有关。
内存泄漏:指用不到的变量,依然占居着内存空间,不能被再次利用起来。
function fn(){
var gn= function(){
console.log("hello")
}
return innerFn
}
var result = fn()
针对这种情况,该如何解决呢?
1.将不使用的局部变量赋值为null
2.避免使用闭包
以上图为例,我们应当执行
result = null
垃圾回收
垃圾回收是一种自动的内存管理机制。当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收。
回调
对于回调函数,我们可以这样理解:有函数a和函数b两个函数,函数b是函数a的参数,先执行函数a,当到达一定条件时,将函数b作为参数代入函数a中继续执行,那么这个函数b就是所谓的回调函数( callback )。
function fn(arg) {
arg()
}
function gn(arg) {
console.log("222")
}
fn(gn)
自调用
函数的调用就是函数自己调用自己
function fn(){
console.log("250")
fn()
}
fn()
但这会无限循环运行,导致电脑卡死。
因此,我们需要对其进行控制
var n=3
function fn (n) {
if(n<=1) return 1
else{
return n*fn(n-1)
}
}
fn(n)