全球主机交流论坛

标题: 技术问题:javascript之闭包,不知道这样理解对不对 [打印本页]

作者: ptc123    时间: 2020-8-26 12:08
标题: 技术问题:javascript之闭包,不知道这样理解对不对
所谓闭包,是指访问和写入局部作用域的机制。
说到底,是对局部作用域的访问,(给子过程保存现场),类似于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) //异步
}


作者: llmwxt    时间: 2020-8-26 12:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 爱上程序员    时间: 2020-8-26 12:11
大水比

薅羊毛
作者: 无敌    时间: 2020-8-26 12:11
这个是真的不懂、
作者: 朕的大清完了?    时间: 2020-8-26 12:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: hostloccom    时间: 2020-8-26 12:26
es6以后,let就可以咯
作者: Miriam    时间: 2020-8-26 12:30
闭包应该是一种思维吧
作者: 靓坤    时间: 2020-8-26 13:11
用let就可以重复变量名了
作者: 我是一个大水怪    时间: 2020-8-26 13:58
本帖最后由 我是一个大水怪 于 2020-8-26 14:04 编辑

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

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

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

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

我归纳的其实同样是误人子弟,但是我系统学习后的理解,与正统理解偏差不会太大。完全的正统理解看你个人需求,对我而言基本理解就可以了,除非我要给别人传道授业。
作者: 蛋蛋    时间: 2020-8-26 14:06
我都是把它理解成一个封闭的作用域,防止污染




欢迎光临 全球主机交流论坛 (https://sunk.eu.org/) Powered by Discuz! X3.4