闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。全局变量在每个模块都可调用,这势必将是灾难性的。 所以推荐使用私有的,封装的局部变量。 一般函数执行完毕后,局部活动对象就被销毁,,内存中仅仅保存全局作用 JavaScript中的闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后。闭包的关键在于它能够保持对外部作用域的引用,防止这些变量被垃圾回收机制回收,从而使得这些变量在内存中持久存在。 闭包的三个主要特性: 1. **函数嵌套函数**:一个函数可以定义在另一个函数内部,内部函数可以访问外部函数的变量。 2. **函数内部引用外部变量**:内部函数可以记住并访问外部作用域的变量,即使外部函数已经执行完毕。 3. **变量不被垃圾回收**:由于内部函数保留了对外部变量的引用,这些变量不会在函数执行后立即被清理。 **闭包的优点**: 1. **变量长期存储**:闭包可以用来创建持久化的数据存储,避免全局变量污染。 2. **避免全局变量**:通过闭包,可以创建私有变量,防止全局变量的滥用,增加代码的封装性和安全性。 3. **私有成员**:闭包可以实现函数内部的私有成员,外部只能通过特定接口访问,实现模块化。 **闭包的实现示例**: 1. 局部变量累加: - 使用闭包,可以在每次调用内部函数时累加局部变量,如`outer()`函数的例子,`x`变量在每次调用`y()`时都会累加。 2. 函数声明与函数表达式: - `function`关键字声明函数,如`abc()`,也可通过表达式方式如`(function (){...})()`创建匿名函数。 3. **模块化代码**: - 通过闭包返回一个包含内部函数的对象,可以减少全局变量,如`abc`变量的例子,内部的`a`变量和`bbb`, `ccc`函数都是私有的。 4. **私有成员的存在**: - 创建一个闭包,返回一个包含对私有变量和方法的引用的对象,如`aaa`,这样`bbb`和`ccc`可以访问并修改私有变量`a`。 5. **在循环中的应用**: - 在循环中使用闭包可以捕获循环变量的值,如点击`li`元素时,每个元素的点击事件都可以获取到正确的索引`i`,这是因为在闭包中,`i`的值被保存下来。 **垃圾回收与闭包**: JavaScript的垃圾回收机制通常基于引用计数或标记清除策略。在闭包中,如果内部函数引用了外部变量,这些变量的引用计数不为0,因此不会被垃圾回收。然而,如果所有对外部变量的引用都被解除(如`fun = null`),则闭包将不再有效,相应的变量会被回收。 **注意点**: - 不当使用闭包可能导致内存泄漏,因为局部变量长时间占用内存。 - 避免在不必要的场景下创建闭包,以减少内存消耗。 - 使用闭包时,要理解其作用和生命周期,以免出现预期外的行为。 闭包是JavaScript中非常重要的概念,它允许我们创建复杂的功能,如模块化、数据封装和状态管理,同时也需要注意合理使用以避免潜在的问题。
- 粉丝: 2
- 资源: 961
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助