当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于【闭包】的个人理解,如果有误请指正?

段干长恨
2023-06-08

一、作用

1、数据私有。解决同名后导致换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题
2、产生作用域链
3、延长变量的生命周期。当产生闭包后,闭包函数依赖的数据就会被保存在内存中,并且不会被垃圾回收机制回收

二、产生方式

内层函数去访问外层函数中的数据就会产生闭包

三、缺点

容易导致内存泄露

四、对于网上流传闭包作用的个人理解(望指正)
(一)数据私有
我看好多视频都说是解决在全局作用域中定义数据,函数内部依赖这个数据,再外面修改了这个数据导致影响函数内的数据的问题,但是你再全局作用域中修改肯定是出于某种目的,那这个数据就只能放在外面,因为放在里面修改不了,如果是同名的问题,let 关键字也会报错,重新取个名字就好,不需在弄个闭包这么麻烦,所以最主要的目的我觉得还是是同名,因为同名会导致你换个意思相近的单词,或者加一些前缀后缀,造成可读性变差的问题,我觉的数据私有主要还是解决这个问题,而不是防止外层修改内层的数据

(二)内层函数可以访问外层函数中的变量
这其实不是闭包的作用,而是闭包产生了作用域链,是作用域链的作用

共有3个答案

姬魁
2023-06-08

闭包是基于某个目标设计出来的概念,不是某些特性组合产生的现象,所以闭包不需要理解,闭包需要记忆。对所有的同学都一样,不要看一些乱七八槽的文章,然后配合自己的经验,视图去理解;去找经典文章,认真看仔细看,然后把里面的概念记住。

比如:MDN 闭包。

至于缺点和作用,只要你能记住、记全那些概念,很容易就可以推导出来。

类似的点还有很多,比如 event loop,好好看经典文章,好好记。

堵浩波
2023-06-08

自己的总结,提供参考:

https://segmentfault.com/a/1190000042988629
咸正平
2023-06-08

你的理解基本上都没有问题,对于“防止全局作用域中的数据被修改”的问题,这是闭包的一个用法,但不是它的主要的想达到目的。闭包确实会产生作用域链,这是因为闭包函数可以访问它的父函数的作用域。这也是 JS 的作用域链的特性,不仅是闭包的特性。你可以理解为,闭包是利用了 JS 的作用域链特性

 类似资料:
  • 本文向大家介绍javascript闭包的理解,包括了javascript闭包的理解的使用技巧和注意事项,需要的朋友参考一下 1、首先我们要知道变量作用域链 变量的作用域分两种:全局变量和局部变量。没有定义到任何函数中的变量为全局变量,在函数中定义的变量为局部变量,注意在函数内部定义变量时一定要使用var关键字,不带var关键字的变量为全局变量。 javascript中每一段代码都有与之关联的作用域

  • JS代码 变量 num 在函数执行完毕后没有被销毁,当我第二次调用 fun1 的时候输出 num=5,而变量 n 每次执行时都会创建一个新的,导致两次调用输出都是 1,这是为什么?同样都是函数内部的变量 变量 num 在执行过程中是如何被保留下来的?

  • 在中引用会调用闭包,只要在垃圾回收器周围保留就不会清理。问题是--会发生什么?即使它没有被引用,它也是由那个闭包持有的吗?垃圾回收器是否会看到没有引用并将其清理掉?还是只要我坚持,就会与一起存在?(理想的答案是引用ECMA规范。)

  • 本文向大家介绍JavaScript闭包相关知识解析,包括了JavaScript闭包相关知识解析的使用技巧和注意事项,需要的朋友参考一下 闭包是JavaScript中的一个难点,同时也是它的特色,JavaScript的很多高级应用都要依靠闭包来实现。以下是我学习闭包的记录,希望对你有些帮助。 变量作用域 在学习闭包之前,我们首先要理解JavaScript不同与其他语言独特的变量作用域。在JavaSc

  • 本文向大家介绍Javascript的闭包详解,包括了Javascript的闭包详解的使用技巧和注意事项,需要的朋友参考一下 前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读

  • 本文向大家介绍JavaScript闭包详解,包括了JavaScript闭包详解的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章我们对预解释作了概述,在写这篇博文前打算写几个经典案例,考虑到那些案例综合性比较强,也就循序渐进的有了这篇博文,这样对于学习和深入JavaScript也更加容易入手。 序 一同事去面试,面试官问了一道题:你写一个闭包我看下?于是同事火速写出如下代码: 然后面试官摇摇头