js-闭包

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的使用场景:

1.setTimeout 

原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。

// 会返回一个没有传参的子函数
// 在子函数中可以执行父函数的传参
function f1(a) {
    // 子函数:使用父函数的传参,但自身不需要任何传参
    function f2() {
        console.log(a)
    }
    return f2
}
// 通过f1获取无参数的f2
setTimeout(f1(1), 1000) //一秒之后打印出1

2、事件处理 

定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。

// 通过传参,返回一个新的不需要参数的函数对象
function changeSize(size) {
    return function () {
        document.body.style.fontSize = size + 'px'
    }
}

// 添加点击事件的处理:使用传参
document.getElementById('size-12').onclick = changeSize(12)
document.getElementById('size-20').onclick = changeSize(20)
document.getElementById('size-30').onclick = changeSize(30)

3、函数防抖

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。

4.封装私有变量

   为了防止一个变量可以随便进行访问

function privateSum() {
    // 私有变量
    var sum = 0
    // 存放对私有变量的操作函数
    var operations = {
        // 每次调用都会使用更新后的sum
        inc: function () {
            sum++
            return sum
        },
    }
    // 返回存储操作函数的对象
    return operations
}
// 获取对私有变量的操作函数
let sum = privateSum()

// 对私有变量执行操作
console.log(sum.inc()) //1
console.log(sum.inc()) //2
console.log(sum.inc()) //3

闭包作用域+为什么内存泄漏

   闭包的作用域链

    1、内部函数innerFn()创建相对于自己的全局变量作用域,保存在[[Scope]]属性中。

    2、对于内部函数而言,外部函数中的活动对象(局部变量)也属于自己的作用域链

    3、即使外部函数执行完毕,但仍然在内部函数的属性([[Scope]]作用域链)中进行引用

           即使外部函数的执行环境/作用域链全部销毁,但是变量还在内存中留着呢

   4、根据垃圾回收机制,被引用的变量不会回收,因此会产生内存泄露(memory lack)

举例(闭包(closure)+使用场景)

function f1() {
    // 被闭包使用
    let n = 100
    
    // 闭包f2
    function f2() {
        n = n + 100 // 作用域链:f2内部没有n,向上一层在f1中查找到n
                    // 每次调用f2的时候,n都会使用上次更改后的值
        console.log(n)
    }
    
    // 返回的是函数f2
    return f2
}

var temp = f1() // temp本质 = f2

temp() // 200 // 本质=f2()
temp() // 300 // 本质=再次f2(),这时候再次对n进行修改。这时获取到的n是200了。 

temp = null // 取消对闭包(内部函数)的引用

 

 

 

 

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值