JavaScript闭包从概念、原理到应用

简介: 闭包的概念:有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。

何为闭包?

闭包的概念:有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。

从官方定义我们知道闭包是一个函数,只不过这个函数有[特殊权限],可以访问到另一个函数的作用域。

特殊权限?

因为我们知道函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限。

我们先来看一段普普通通的函数。

网络异常,图片无法展示
|

控制台输出结果:

1
 2
 3

再来看一段局部变量的代码:

网络异常,图片无法展示
|

控制台输出结果:

红色框是当前的这段局部变量代码。看得出,他并没有累加。

网络异常,图片无法展示
|

当我们调用时,局部变量b为0,然后b+=1后返回一个值,然后,此时,因为全局变量不会消失,而局部变量在运行完后,他是会被JavaScript的运行机制处理掉的。

所以,当你调用第二次,他重新创建了变量b,然后,结果可想而知。

//闭包函数
 function add3(){
     var b= 0;
     return function(){
         return b += 1;
     }
 }

最后,就看看我们的特殊权限。

我们将运算过程使用匿名函数包裹,此时,这个匿名函数在我们的主函数内,就相当于时主函数的儿子,既然是父子关系,自然你父亲对待你和对待其他孩子不一样。这就是里面的这个函数的特殊权限。

所以,他是有权限去访问到内部的b的,当我们调用这个函数,因为有子函数的存在,所以b这个对象不会消失。相当于后继有人,b就不会被机制回收。

所以,此时运行结果,也是1、2、3

随后,贴上三段代码,自行琢磨:

//普通函数(全局变量)
 var a = 0;
 function add(){
     return a += 1;
 }
 //调用3次函数
 for (var i = 0; i <3; i++){
     console.log(add());
 }
 //普通函数(局部变量)
 function add2(){
     var b= 0;
     return b += 1;
 }
 //调用3次函数
 for (var i = 0; i <3; i++){
     console.log(add2());
 }
 //闭包函数
 function add3(){
     var b= 0;
     return function(){
         return b += 1;
     }
 }
 //调用请自行琢磨

最终原理

闭包的实现原理,其实是利用了作用域链的特性,我们都知道作用域链就是在当前执行环境下访问某个变量时,如果不存在就一直向外层寻找,最终寻找到最外层也就是全局作用域,这样就形成了一个链条。

至于什么是作用域链,你可以将其看成函数嵌套。

访问某个变量时,如果不存在就一直向外层寻找。

闭包优势

作用1: 隐藏变量,避免全局污染

作用2: 可以读取函数内部的变量

同时闭包使用不当,优点就变成了缺点:

缺点1: 导致变量不会被垃圾回收机制回收,造成内存消耗

缺点2: 不恰当的使用闭包可能会造成内存泄漏的问题

为什么使用闭包时变量不会被垃圾回收机制收销毁呢?

这里需要了解一下JS垃圾回收机制:

JS规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可节省内存

使用闭包时,按照作用域链的特点,闭包(函数)外面的变量不会被销毁因为函数会一直被调用,所以一直存在,如果闭包使用过多会造成内存销毁

附言

所以说,我们要通晓一个事物的原理,并且最优化的使用它。知己知彼,方可百战百胜。

相关文章
|
16小时前
|
JavaScript 前端开发
JavaScript 的 闭包
JavaScript 的 闭包
3 0
|
4天前
|
前端开发 JavaScript API
JavaScript中的异步编程技术及应用
【2月更文挑战第2天】传统的JavaScript编程方式在处理异步操作时存在诸多不足,为了解决这一问题,近年来涌现出了一系列异步编程技术,本文将深入探讨Promise、async/await等异步编程解决方案,并结合实际案例展示其在前端开发中的应用。
|
5天前
|
前端开发 JavaScript UED
JavaScript 中的异步编程及其应用
【2月更文挑战第1天】 在前端开发中,JavaScript 的异步编程是一个重要的话题。本文将深入探讨 JavaScript 中的异步编程机制,包括回调函数、Promise、async/await 等,以及在实际开发中的应用场景和最佳实践。
|
5天前
|
前端开发 JavaScript UED
《JavaScript中的异步编程技巧与应用》
【2月更文挑战第1天】在前端开发中,异步编程是至关重要的一环。本文将探讨JavaScript中常用的异步编程技巧,包括Promise、async/await等,并结合实际案例展示其应用场景和优势。
|
5天前
|
JavaScript 前端开发 Java
深入理解JavaScript中的闭包机制
闭包是JavaScript中一个重要且常用的概念,能够帮助我们更好地管理变量和函数作用域。本文将深入探讨JavaScript中闭包的原理及应用,帮助读者全面理解闭包在实际开发中的作用。
15 6
|
5天前
|
前端开发 JavaScript
JavaScript中的异步编程及Promise的应用
在前端开发中,异步编程是常见的需求,而Promise作为一种解决异步操作的技术,具有很高的应用价值。本文将介绍JavaScript中的异步编程原理,并结合实际案例详细讲解Promise的使用方法及其在前端开发中的应用。
8 2
|
5天前
|
存储 自然语言处理 JavaScript
深入理解JavaScript中的闭包机制
闭包是JavaScript中一个重要且常见的概念,它能够帮助我们更好地管理变量作用域和实现数据封装。本文将深入探讨JavaScript中闭包的原理、应用场景以及优缺点,帮助读者更全面地理解和运用闭包机制。
|
6天前
|
JavaScript 前端开发 开发者
深入理解JavaScript中的闭包
闭包是JavaScript中一个重要且常用的概念,它能够帮助开发者有效地管理变量作用域并实现更灵活的编程功能。本文将深入探讨JavaScript中闭包的原理、使用方法以及常见应用场景,帮助读者更好地理解和运用闭包。
9 2
|
6天前
|
JavaScript 前端开发 开发者
深入探讨前端框架Vue.js的数据绑定原理
在前端开发中,数据绑定是Vue.js框架的核心特性之一,它实现了视图与数据的双向绑定,极大地提高了开发效率和用户体验。本文将深入探讨Vue.js数据绑定的原理,从响应式数据、依赖追踪到虚拟DOM等方面进行详细分析,帮助读者更好地理解Vue.js框架的工作机制。
9 0
|
6天前
|
前端开发 JavaScript
JavaScript 中的异步编程:Promise 和 Async/Await 的实现与应用
在Web开发中,JavaScript异步编程是一个不可忽视的重要话题。本文将深入探讨JavaScript中Promise和Async/Await的实现原理与应用场景,通过实例代码带您了解如何优雅地处理异步操作,提升代码的可读性和可维护性。

相关产品

  • 云迁移中心