首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 闭包和作用域

一、基础概念

  1. 作用域
    • 在JavaScript中,作用域定义了变量的可访问性。当代码在一个环境中执行时,会创建变量对象的作用域链。全局作用域在整个脚本中都可访问变量,在函数内部定义的变量具有函数作用域(在ES6之前),在块(如if语句、for循环等)内部定义的变量具有块级作用域(ES6引入letconst后)。
    • 例如:
    • 例如:
  • 闭包
    • 闭包是指有权访问另一个函数作用域中的变量的函数。即使这个函数已经执行完毕,它仍然可以访问其外部函数作用域中的变量。
    • 例如:
    • 例如:

二、优势

  1. 数据封装和私有变量
    • 闭包可以用来创建私有变量。通过在外部函数中定义变量,在内部函数中访问和操作这些变量,外部无法直接访问这些变量。
    • 例如:
    • 例如:
    • 在这个例子中,count变量是私有的,只能通过incrementdecrement方法来操作。
  • 函数工厂
    • 可以根据不同的输入创建具有不同行为的函数。
    • 例如:
    • 例如:

三、类型(从不同角度理解)

  1. 按变量访问层次
    • 可以分为简单闭包(只访问外部函数的一个或多个变量)和复杂闭包(访问外部函数的变量并且可能涉及到多层嵌套函数中的变量访问等情况)。
  • 按是否立即执行
    • 有常规闭包(如上述示例,函数执行后返回内部函数形成闭包)和立即执行函数表达式(IIFE)闭包(虽然IIFE本身执行完毕,但它内部的函数如果返回并且被引用,也会形成闭包)。
    • 例如:
    • 例如:

四、应用场景

  1. 回调函数
    • 在异步编程中,如事件处理程序、定时器回调等经常用到闭包。
    • 例如,在点击事件处理程序中:
    • 例如,在点击事件处理程序中:
    • 这里的点击事件处理函数就是一个闭包,它可以访问setupButton函数中的message变量。
  • 模块模式
    • 构建JavaScript模块,将相关的功能和数据封装在一起,对外提供有限的接口。
    • 例如:
    • 例如:

五、常见问题及解决方法

  1. 内存泄漏
    • 原因:如果闭包持续引用外部函数的变量,并且这些变量占用了大量内存,而闭包又长时间存在(例如被全局变量引用等情况),就可能导致内存泄漏。
    • 解决方法:确保在不需要闭包时,解除对闭包的引用,让垃圾回收机制可以回收相关内存。
    • 例如:
    • 例如:
  • 意外的变量共享
    • 原因:当使用闭包创建多个类似功能的函数时,如果在外部函数中共享了可变变量,可能会导致意外的结果。
    • 解决方法:确保每个闭包有自己独立的变量环境,或者正确地初始化共享变量。
    • 例如:
    • 例如:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

15分11秒

32.尚硅谷_JS高级_闭包的作用.avi

20分38秒

27.尚硅谷_JS高级_作用域与作用域链.avi

14分52秒

30.尚硅谷_JS高级_闭包理解.avi

17分49秒

31.尚硅谷_JS高级_常见的闭包.avi

18分33秒

34.尚硅谷_JS高级_闭包应用_自定义JS模块.avi

21分22秒

58.尚硅谷_JS基础_全局作用域

21分40秒

59.尚硅谷_JS基础_函数作用域

4分39秒

33.尚硅谷_JS高级_闭包的生命周期.avi

10分1秒

41.尚硅谷_JS高级_闭包终极面试题.avi

7分6秒

19 - 尚硅谷-RBAC权限实战-JS变量的作用域.avi

8分56秒

28.尚硅谷_JS高级_作用域_面试题.avi

18分49秒

125_尚硅谷_Go核心编程_闭包最佳实践和分析.avi

领券