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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包在编程中有很多应用场景,以下是一些常见的例子: 1. 数据封装和私有变量:闭包可以用来创建私有变量,从而实现数据封装和保护。这在模块化编程和面向对象编程中非常有用。 2. 函数工厂:闭包可以用来创建一系列相关的函数,这些函数共享相同的外部变量。这在创建类似于Python中的装饰器或JavaScript中的高阶函数时非常有用。 3. 延迟执行和计时器:闭包可以用来实现延迟执行和定时器功能。例如,在JavaScript中,setTimeout和setInterval函数使用闭包来实现延迟执行和定时器功能。 4. 记忆化(Memoization):闭包可以用来实现记忆化,即缓存函数的计算结果,以便在后续调用中重用。这可以提高函数的性能,特别是在处理计算密集型任务时。 5. 事件处理和回调函数:在JavaScript等事件驱动的编程环境中,闭包常用于实现事件处理和回调函数闭包可以捕获事件处理函数的上下文,使得事件处理函数可以访问其所需的外部变量。 6. 部分应用(Partial Application)和柯里化(Currying):闭包可以用来实现部分应用和柯里化,这是一种将多参数函数转换为一系列单参数函数的技术。这可以简化函数调用,使得代码更加简洁和可读。 7. 实现迭代器和生成器:在某些编程语言中,例如Python和JavaScript闭包可以用来实现迭代器和生成器,这是一种用于遍历数据结构的高效方法。
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值