javascript设计模式(三)----闭包

简介: javascript设计模式(三)----闭包

前言

前面我们学习了javascript语言的多态,封装以及基于原型编程,在我们介入到设计模式的真正学习中,我们将进一步学习js中的闭包和高阶函数,因为这些在后面设计模式的实现中占到了很重要的作用,这一章我们将先学习闭包的相关知识


正文

相信大家已经在很多文章看到了关于闭包的内容,但是请原谅我再一次老生常谈闭包的作用,因为闭包在javascript编程中占到很重要的分支,是否能够理解闭包决定以后对更多设计模式理解的程度


封装变量

函数作用域

javascript编译中有变量作用域的概念,也就是变量的有效区域的意思,平常我们在函数外定义的变量是作为全局变量,如果用var定义变量在函数内部,这个变量的作用域就在这个函数体内,只有这个函数可以使用

上面可以看到在全局范围是没办法访问函数test内的变量a的


利用闭包封装工具函数

上面说到,因为js的变量访问是由内到外的,所以从全局直接访问函数内作用域是不可以的,但是如果在函数内定义另外的函数,里面的函数就可以访问到外部函数的变量,这就是闭包。

这样说大家可能还是很抽象,不知道这样有什么作用,这里举一个很常见的数据结构的例子来方便大家理解,比如我们需要获取一棵树的中序遍历并且输出出来应该怎么写呢

640.png

假设root是根节点,执行完上面的函数以后,res就成了最后包含中序遍历结果的数组,但是这样写肯定不好,为什么呢,每当我们需要获取一次中序遍历的时候我们就需要把这段代码复制粘贴,所以我们把它封装成工具函数

640.png

这样就封装成了中序遍历的工具函数,只需要把根节点传给它,它就可以返回中序遍历的数组,其中封装在midTraversal中的dfs函数就是闭包,res就是midTraversal函数的私有变量


延续局部变量的寿命

我们知道当一个函数结束以后,这个函数中的变量会被销毁掉,但是如果使用了闭包,因为局部变量在闭包中仍有调用,所以并不会销毁这个局部变量,相当于延续了它的寿命。

下面举一个例子方便大家理解,在举这个例子之前,先给大家普及一下数据埋点的概念,在商业化项目中,经常需要把用户的一些行为数据传给服务器端,来便于企业分析用户喜好进行精准性推荐,这种服务器端请求是只需要传递但是不需要服务器作出相应或者回复的,所以我们经常会用Img标签来进行数据埋点

640.png

上面是数据埋点的一种实现,但是这种实现方法有可能会造成数据丢失的问题,为什么呢,因为report函数在执行完以后就会将img标签销毁掉,而这时候,img向对应src的http请求可能尚未开始,这时候我们就可以利用闭包去解决这个问题

640.png

这样就不会出现之前的问题,在img生成后,因为闭包仍然会被保留


小节

这一节我们介绍了闭包,我们了解到闭包实际就是定义在函数内部的函数,可以起到定义私有变量以及延续局部变量寿命的作用,在后面一些设计模式的定义中,我们会了解到更多闭包的应用

小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!

目录
相关文章
|
4天前
|
自然语言处理 JavaScript 前端开发
Javascript中的闭包encloure
【10月更文挑战第1天】闭包是 JavaScript 中一种重要的概念,指函数能够访问其定义时的作用域内的变量,即使该函数在其词法作用域之外执行。闭包由函数及其词法环境组成。作用域链和词法作用域是闭包的核心原理。闭包常用于数据隐藏和封装,如模块模式;在异步操作中也广泛应用,如定时器和事件处理。然而,闭包也可能导致内存泄漏和变量共享问题,需谨慎使用。
|
18天前
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
|
9天前
|
缓存 JavaScript 前端开发
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
该文章详细讲解了JavaScript中的作用域、闭包概念及其应用场景,并简要分析了函数柯里化的使用。
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
|
11天前
|
JavaScript 前端开发
JavaScript 闭包
JavaScript 闭包
11 1
|
14天前
|
自然语言处理 前端开发 JavaScript
探索JavaScript中的闭包及其实际应用
本文深入探讨了JavaScript中闭包的概念、特性及其在实际项目中的应用。通过具体示例,详细讲解了闭包的创建方法和用途,揭示了闭包在数据保护和模块化开发中的重要性。同时,还讨论了闭包可能带来的内存管理问题及优化策略,为前端开发者提供了全面的闭包知识和实践指导。
|
23天前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
本文深入探讨了JavaScript中闭包的概念,从定义、作用域链和实际应用等方面进行了详细阐述。通过生动的比喻和实例代码,帮助读者理解闭包在函数执行上下文中的重要性,以及如何在实际开发中有效利用闭包解决复杂问题。同时,文章也指出了过度使用闭包可能导致的潜在问题,并给出了相应的优化建议。
|
2月前
|
JavaScript 前端开发 安全
详细讲解JavaScript中的闭包问题附代码演示
闭包是JavaScript中一关键概念,它允许内部函数访问外部函数的作用域,从而实现变量的封装与持久化。本文通过示例解释了闭包的工作原理及其优势,如数据隐藏和私有变量的实现;同时也指出了闭包可能导致的内存占用问题,强调合理使用的重要性。
24 1
|
2月前
|
JavaScript 前端开发 Java
JavaScript中的闭包概念讲解
闭包是指函数内部嵌套另一个函数,并且内部函数引用了外部函数的数据(如变量或函数)。这样的内部函数被称为闭包。以示例代码为例,`fn1` 中有两个闭包函数 `fn2` 和 `fn3`,它们都可以访问并修改 `fn1` 中的变量 `a`。
16 1
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
58 0
|
2月前
|
自然语言处理 JavaScript 前端开发
下一篇
无影云桌面