我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文了解JavaScript闭包函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文了解JavaScript闭包函数

变量作用域

要理解JavaScript闭包,就要先理解JavaScript的变量作用域。

变量的作用域有两种:全局的和局部的(全局变量和局部变量)

JavaScript中,在函数内部可以直接读取到全局变量。


var n=10
function fn(){
	alert(n)
}
fn()      //10

而在函数外部无法读取到函数内部的变量。


function fn(){
	var n=10;
}
fn()
alert(n)   //n is not defined    函数外部无法读取到函数内部的n

注意:函数内部使用var声明变量的时候,这个变量是局部变量,如果不使用var,那么这个变量就是一个全局变量。

例如:


function fn(){
	n=10;
}
fn()
alert(n)   //10

另外,函数的参数也是局部性的,只在函数内部起作用。

在正常情况下,我们是无法得到函数内部的局部变量的,只有变通方法才可以——在函数内部再声明一个函数。


function f1(){
	var n=10;
	function f2(){
		alert(n)
	}
}

f2函数可以得到f1函数内的所有局部变量,但是f1函数却无法得到f2函数内部的局部变量——JavaScript语言特有的“链式作用域”结构。(即子对象会一级一级地向上寻找所有父对象的变量),所以,父对象的所有变量,对于子对象都是可见的。

f2函数可以获取到父级函数f1的局部变量,那么如果把f2()函数返回,在函数f1外部就可以访问到f1()函数内部的变量了。

例如:


function f1(){
	var n=10;
	function f2(){
		alert(n)
	}
	return f2()
}
f1()           //页面弹出10

例子中的f2()函数就是一个闭包函数。

闭包的概念

由于作用域原因,我们无法在函数外访问函数里面定义的变量,但有事我们又有这个需求,因此就出现了闭包的概念。

闭包是指有权访问另一个函数作用域中的变量的函数。

在上面的例子中,内部函数f2就是一个闭包函数。

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

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。

闭包的用途

(1)可以读取父级作用域函数内部的变量;

(2)让变量的值始终保存在内存中(让局部变量变成全局变量),不被垃圾回收机制清除。

闭包的缺点

由于闭包会使函数中的变量都保存到内存中,垃圾回收机制不清理,内存消耗很大,所以不能滥用闭包,否则可能导致内存泄漏。

补充:

什么是内存泄漏?

程序的运行都是需要内存的。只要对内存提出要求,操作系统必须供给内存。
当应用程序中的一些代码变量不再需要用到内存时,但是没有被操作系统或者可用内存池回收,就说明它发生了内存泄漏。

即,当已经不再需要某块内存时,这块内存还存在着——内存泄漏

解决闭包引起的内存泄漏的问题:

在退出函数之前,将不使用的局部变量全部删除。

例如:将当前变量的值设置为‘null',当垃圾回收机制启动时,会自动对这些值为‘null'的变量回收。

最后总结一下闭包的好处与坏处

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

总结

到此这篇关于JavaScript闭包函数的文章就介绍到这了,更多相关JavaScript闭包函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文了解JavaScript闭包函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一篇文章带你了解JavaScript 函数闭包

本文基于JavaScript基础。从函数的基本概念,(变量和全局 )。函数为什么需要闭包,使用闭包可以让私有变量成为可能。通过案例(计数器)的讲解, 以及对嵌套函数中闭包的应用能够更好的理解。

一文了解你不知道的JavaScript闭包篇

这篇文章主要为大家详细介绍了一些你不知道的JavaScript闭包相关知识,文中的示例代码讲解详细,对我们学习JavaScript有一定帮助,感兴趣的可以跟随小编一起学习一下
2022-11-13

怎么理解JavaScript闭包函数

本篇内容介绍了“怎么理解JavaScript闭包函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!变量作用域要理解JavaScript闭包,
2023-06-25

一文详解JavaScript中的闭包

JavaScript 闭包是一种重要的概念,在 JavaScript 编程中被广泛使用。尽管它可能会让初学者感到困惑,但它是理解 JavaScript 语言核心的关键概念之一。
2023-05-14

重学JavaScript(函数)闭包

JavaScript函数内部可以读取函数外部的变,但反过来,函数的外部通常则无法读取函数内部的变量。在实际应用中,有时需要真正在函数外部访问函数内部的局部变量,此时最常用的方法就是使用闭包。

一篇文章带你了解JavaScript函数

一个JavaScript函数是一个为执行特定任务而设计的代码块,JavaScript函数当调用时被执行。

一文带你了解JavaScript函数柯里化

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。本文将通过一些示例带大家深入了解JS的函数柯里化,需要的可以参考一下
2023-02-01

一篇文章带你了解JavaScript函数定义

本文主要介绍了JavaScript 函数的定义。通过讲解了函数的定义,函数的表达式,如何去定义构造函数,以及如何去调用自己创建的函数,每一点都做了详细的讲解,通过用丰富的案例帮助大家更好理解。

JavaScript 函数的闭包是怎样的

JavaScript 函数的闭包是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 前言我们知道,作用域链查找标识符的顺序是从当前作用域开始一级一级往上查找。因此,通过
2023-06-16

一文掌握Python返回函数、闭包、装饰器、偏函数

本篇文章给大家带来了关于Python 的相关知识,其中主要整理了高级编程的相关问题,包括了返回函数、闭包、装饰器、偏函数等等内容,下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】1.返回函数高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。我们在操作函数的时候,如果不需要立刻求和,而是在后面的代码中,根据需要再计算 例如下面# -*- coding: utf-
2022-06-30

一文搞懂JavaScript中最难理解概念之一的闭包

闭包常常被誉为JavaScript中最难理解的概念之一,这篇文章就来带大家深入了解一下JavaScript中闭包的概念、实现与应用,需要的可以参考一下
2023-05-14

深入了解Rust中函数与闭包的使用

本文主要介绍一下Rust函数相关的内容,首先函数我们其实一直都在用,所以函数本身没什么可说的,我们的重点是与函数相关的闭包、高阶函数、发散函数,感兴趣的可以学习一下
2022-11-13

编程热搜

目录