聊聊JS中的闭包

闭包是能够读取其他函数内部变量的函数,它是函数内部和外部之间的桥梁。文章通过示例解释了词法作用域的概念,指出函数的作用域在创建时即确定。闭包常用于隐藏和保护内部变量,但过度使用可能导致内存消耗。构成闭包需要函数嵌套、内部函数引用外部变量并作为返回值。文章提请注意,每次调用外部函数都会产生新闭包,且当内部函数不再被引用时会被垃圾回收。
摘要由CSDN通过智能技术生成

闭包



前言

提示:这里可以添加本文要记录的大概内容:

闭包是什么,闭包的使用,什么是函数的词法作用,需要注意什么。


提示:以下是本篇文章正文内容,下面案例可供参考

一、闭包是什么?

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

二、函数的词法作用

示例

函数的作用域,在函数创建时就已经确定的,这就是词法作用域。
函数one是在全局的时候创建的,所以它的作用域就是全局的a,即使在函数two里去调用函数one,也不影响。

代码如下(示例):

	let a = '我是1'

    function one (){
        document.write(a)
    }
    //one();//a = '我是1'

    function two() {
        let a = '我是2'
        one()
    }
    two();//a = '我是1'

我们在函数three里面再创建一个函数four,这时函数four会去找自身的变量a,找不到就到函数three里面找,所以函数four里面变量a的值是函数three的a值,返回函数four,在全局调用函数three,赋给一个变量,其实就是在调用函数four。换句话说,函数three中的a只有函数four才能访问,闭包就是利用了词法作用。这里的函数four就是一个闭包。


        let a = '我是1'

        function three(){
            let a = '我是3'

            function four() {
                document.write(a)
            }
            return four
        }

        let res = three()

        res()// a = '我是3'

三、闭包的使用

提示:看看上面的代码:

通俗地讲,闭包就是能访问到外部作用域变量的函数,什么时候使用闭包呢?当我们需要隐藏一哦写不希望别访问的内容时就可以使用闭包。

构成闭包的条件:
1、函数必须嵌套使用(套娃)
2、内部函数要引用到外部函数的变量
3、内部函数要作为返回值返回

示例:
我们要调用一个函数,每调用一次数值+1;

		function open() {
            let a = 0
            function ye(){
                a++
                console.log(a);
            }
            return ye
        }

        let res = open()

        res()

也可以直接写成箭头函数:

 		function open() {
            let a = 0
            return() => {
                a++;
                console.log(a);
            }
        }

        let res = open()

        res()

在这里插入图片描述
可以看到控制台打印出的a值不会被外部所修改,那么这就是一个闭包。

四、注意事项

闭包的生命周期

1、闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包;

2、在内部函数丢失是销毁(外部调用 = null,内部函数被垃圾回收,闭包消失);

闭包的注意事项

闭包主要用来隐藏一些不希望被外部所访问的内容,也就是闭包要占用一定的内存空间,每重新创建一个新的闭包他会重新开辟一个空间,而且都是一样的闭包。相较于类来说,闭包比较浪费内存空间(类可以使用原型而闭包不可以),需要执行次数少时,使用闭包,次数多时,使用类的封装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值