JavaScript--函数--闭包、回调和自调用

目录

闭包

闭包的优点

内存泄漏

垃圾回收

回调

自调用


闭包

闭包(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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值