OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

请问最好的理解闭包最好的方法是什么?

定西Cheer
定西Cheer 发布于 2016年05月26日 | 更新于 2016年05月30日
无人欣赏。

死在闭包上好久。。

共50条回复
楼长 ·
tinyfool 回复于 2016年05月26日

你最好问的具体点

2楼 ·
brambles 回复于 2016年05月26日 | 更新于 2016年05月30日

闭包很简单,就是在函数定义时把函数外部的环境打包进函数内,使得在函数体内可以访问到函数体外的环境(主要是访问函数体外的变量)

// 假设这里的环境为 (1)
function(){
 // 假设这里的环境为 (2)
 function(){
 // 假设这里的环境为 (3)
 };
};

在环境(1)中只能访问到环境(1)的变量,但是环境(2)中能同时访问到环境(1)(2)中的变量。环境(3)中能同时访问到环境(1)(2)(3)中的变量。

函数在定义时,把函数体外部的环境全部打包进了函数,使得函数体内可以访问到函数体定义外面的环境。这个函数+所打包的外部环境就称之为闭包。

3楼 ·
tinyfool 回复于 2016年05月27日

2楼 @brambles 我也有点奇怪,有更复杂的情况么?

我一向觉得挺顺理成章的,为啥总有人觉得这个东西难呢?

4楼 ·
599316527 回复于 2016年05月27日

函数里面的能访问外面的变量,外面的不能访问里面的变量

5楼 ·
_yeshuai 回复于 2016年05月27日

是这样,我也是花了好长时间才内化的闭包。主要是因为原来只写过 java ,对 js 里面函数可以直接当参数传递这个事一时半会不习惯(java8 现在也已经支持行为化参数了)。闭包的真正用处是对于那写能够把函数当成参数传来传去的语言的。这个函数是必会有一些自己的东西(能访问到的变量等),这些东西随着代码的执行,一直会被这个函数访问到,这样,这个函数就形成了一个闭包。如果此时你还把这个函数当成参数传递,那么相应的这些东西(变量等)也就一起跟着过去了(能访问到)。

6楼 ·
mistkafka 回复于 2016年05月27日

三点: 1. 编程中的闭包与数学中的闭包:两者概念不同。 2. 编程中的闭包是什么?本质上是一个只有子孙域可以访问得到的公共域。(域可以看作环境、变量;JS中只有function会创建域) 3. 为什么要用闭包?复用、模块化(命名空间)、更好的描述。 关于"复用、更好的描述"可以看这个例子:https://segmentfault.com/a/1190000004589338, 关于"模块化(命名空间)"其实很好理解,localEnv的命名不会覆盖(污染)topEnv嘛!

所有的语言特性都是为了更好的描述!

7楼 ·
brambles 回复于 2016年05月27日

3楼 @tinyfool

我们常见的语言都是词法(静态)作用域,所以真没什么更复杂的情况。

动态作用域的语言这个情况就复杂了......比如 emacs-lisp 这种

8楼 ·
xiaotie 回复于 2016年05月27日

不同语言下闭包有差别;一般不用理解,直接用即可,偶尔踩踩坑了,查搜索引擎为什么踩坑。实在蛋疼的话,选择一两个语言看看他们对闭包的实现机制。

9楼 ·
定西Cheer 回复于 2016年05月27日

2楼 @brambles 这种我懂,可是实际运用的时候好乱 -。- 可能是我太笨了。。

10楼 ·
定西Cheer 回复于 2016年05月27日

1楼 @tinyfool -。-因为我对这个也不懂 但是想要的答案不是二楼那种 但是我又不知道该怎么说。。大概我太小白了。。

本帖有50个回复,因为您没有注册或者登录本站,所以只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]

AltStyle によって変換されたページ (->オリジナル) /