宇宙主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

欧基零壹微头条IP归属甄别会员请立即修改密码
查看: 863|回复: 9

技术问题:javascript之闭包,不知道这样理解对不对

[复制链接]
发表于 2020-8-26 12:08:42 | 显示全部楼层 |阅读模式
所谓闭包,是指访问和写入局部作用域的机制。
说到底,是对局部作用域的访问,(给子过程保存现场),类似于delphi中的property
****什么情况下需要闭包,我认为只有在异步调用子逻辑时,才有用****

1.访问[没什么卵用,在上层声明变量不香吗?]
  (function(){
      var b=0;
      return function() {return b++}
      //return function() {return b}
      })()
  上面返回了一个函数,访问不了b,但可以操作b   
  
2.写入
  (function(x){
      var b=x;
      return function() {return b++}
      //return function() {return b}
      })(5)
  上面返回了一个函数,并且初始化了局部作用域
  
“写入”  实例:*下面两段代码,随便打开一个网页,F12在console中运行* 看效果
var eles=document.getElementsByTagName("A")
for (var i=0;i<eles.length;i++){
   var el=eles[i]
   setTimeout(function(){el.textContent=i},1000) //异步
}
结果:只修改了最后一个A元素;因为:el将会永远指向最后一个A

使用闭包解决:
var eles=document.getElementsByTagName("A")
for (var i=0;i<eles.length;i++){
   var el=eles[i]
   setTimeout(
   (function(e,n){
      var el=e,N=n //保存现场
      return function(){el.textContent=N}
   })(el,i)
   ,1000) //异步
}

发表于 2020-8-26 12:10:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2020-8-26 12:11:29 | 显示全部楼层
大水比

薅羊毛
发表于 2020-8-26 12:11:53 | 显示全部楼层
这个是真的不懂、
发表于 2020-8-26 12:25:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2020-8-26 12:26:02 | 显示全部楼层
es6以后,let就可以咯
发表于 2020-8-26 12:30:30 | 显示全部楼层
闭包应该是一种思维吧
发表于 2020-8-26 13:11:05 来自手机 | 显示全部楼层
用let就可以重复变量名了
发表于 2020-8-26 13:58:22 | 显示全部楼层
本帖最后由 我是一个大水怪 于 2020-8-26 14:04 编辑

```
所谓闭包,是指访问和写入局部作用域的机制。
```
你这种就是典型的因为缺乏正确的学习方式/他人引导而走歧途,结果无外乎:

- 思考偏了,只能坐井观天,看到你所能看到的部分,而缺乏对概念、术语的正统理解
- 思维过虑,本来很简单的东西,如果是正确的学习方式自然而然理解,而错误的学习方式让你怀疑自己是否真的弄懂了,所以你后面的思考得到的举例都是思维过虑的典型表现

闭包的概念来自函数式编程,看看wiki就能基本了解它的正统概念了。或者随便一门函数式编程课程,甚至编程入门课程如sicp-python,都能系统性的理解函数式编程或者编程相关的术语概念。

回到主题,用我的话来说(个人归纳),闭包就是函数式编程语言的一个基本特性,当关联外部函数局部变量(对于内部函数来讲就是自由变量)的内部函数作为返回值返回时,这些自由变量就一直有效,直到该内部函数失效。这样,函数就拥有了状态,不同于传统的无状态模型。

我归纳的其实同样是误人子弟,但是我系统学习后的理解,与正统理解偏差不会太大。完全的正统理解看你个人需求,对我而言基本理解就可以了,除非我要给别人传道授业。
发表于 2020-8-26 14:06:49 | 显示全部楼层
我都是把它理解成一个封闭的作用域,防止污染
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宇宙主机交流论坛

GMT+8, 2024-10-31 05:38 , Processed in 0.062818 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表