关于JavaScript --- 闭包

什么是闭包?

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当 前词法作用域之外执行。 ----《你不知道得JavaScript》

我们来看一段代码:

        function fn1(){
            var name = "zs";
            function fn2(){
                console.log(name);
            }
            return fn2;
        }
        var fn3 = fn1();
        fn3();

这段代码十分清楚的展示了闭包

  • fn2能访问fn1的作用域
  • 把fn2作为返回值
  • fn1执行后,讲fn2的引用赋值给了fn3
  • 执行fn3,输出了fn1里面定义的变量name

一般来说,当函数执行完毕的时候会销毁自身的作用域AO,而闭包却将其执行完毕的作用域保留了下来。fn3依然可以访问该作用域的引用,这个就是闭包

闭包的应用

闭包的应用比较典型是定义模块,我们将操作函数暴露给外部,而细节隐藏在 模块内部:

        function module() {
            var arr = [];
            function add(val) {
                if (typeof val == 'number') {
                    arr.push(val); 
                } 
            }
            function get(index) {
                if (index < arr.length) {
                    return arr[index] 
                } else {
                    return null; 
                } 
            } 
            return {
                add: add, get: get 
            }
        } 
        var mod1 = module();
        mod1.add(1); 
        mod1.add(2); 
        mod1.add(3); 
        console.log( mod1.get(2) ); 

闭包的缺点 : 闭包滥用会造成内存泄露,也就是闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: JavaScript中的闭包是指一个函数可以访问外层作用域的自由变量。从广义的角度上,JavaScript中的函数都是闭包。从狭义的角度上,JavaScript中一个函数,如果确实是访问了外层作用域的变量,那么它是一个闭包。\[1\]闭包可以实现让内部函数访问外部函数的变量,并且可以保持对这些变量的引用,即使外部函数已经执行完毕。\[2\]闭包JavaScript中被广泛应用,比如实现私有变量、模块化开发、异步回调等。\[3\]闭包的底层原理是通过创建一个函数内部的作用域,并将外部变量作为自由变量保存在这个作用域中,使得内部函数可以访问和修改这些变量。 #### 引用[.reference_title] - *1* [JavaScript中的闭包](https://blog.csdn.net/qq_44482048/article/details/128714553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JavaScript-闭包](https://blog.csdn.net/weixin_45203607/article/details/124227668)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值