1
typing 2013-05-30 16:11:34 +08:00 4
对于Closure, 我现在印象最深的例子是这个:
(对比注释行的区别) var callbacks = []; for(var i = 0; i < 3; ++i){ // callbacks.push(function() {console.log(i);}); callbacks.push(function(i){return function(){console.log(i);};}(i)); } _.each(callbacks, function(f) {f();}); |
2
Golevka 2013-05-30 17:04:28 +08:00
没有释放内存中的资源什么的... 提到closure就不得不提到lexical scoping. 从实现角度来说确实是function definition和其所在的environment的绑定.
|
3
xatest 2013-05-30 17:19:42 +08:00
为什么回复这个话题的都是ACG头像?。。。我来打破队形,对比一下函数和闭包:
函数 = {抽象} 闭包 = {抽象 + upvalue + env} |
4
otakustay 2013-05-30 17:19:51 +08:00 2
我有一个专门说闭包的PPT,能把这个消化掉,我觉得闭包已经没有啥能难到你了
https://skydrive.live.com/redir.aspx?resid=5AF9669191A78C07!197 另外关于闭存回收的问题,我也有一个专门的博客总结过 http://otakustay.com/about-closure-and-gc/ |
5
yimity 2013-05-30 17:19:59 +08:00
我觉得要理解闭包首先要理解词法作用域,也就是函数执行时候查找变量等的过程,从函数最里面找,一直找到最外面的函数,如果内层函数没有定义的变量在外层找到,那么就可以说这个是闭包了。也由此可见,javascript 只要是函数,都可以形成闭包。
私有变量,函数等 防止全局变量污染 然后就是保存某些变量的值,防止取得值是最终结果。 初始化等。类似于常量。 效果是一样的,先强制表达式,然后调用。 |
9
otakustay 2013-05-30 17:31:30 +08:00
|
10
switch 2013-05-30 17:35:34 +08:00
(function( window , undefined ){
})( window ); 這個不算是閉包,只是一個匿名函數自調用而已。 |
12
emohacker OP @switch 我也挺纳闷的,之前在网上看有些人说是,看上去也有点像,就记下了,面试时是这么回答的,但是用闭包的概念去套,貌似是解释不通的。
学艺不精,未得其精髓,深入学习中~ |
13
Golevka 2013-05-30 17:48:06 +08:00
|
15
xatest 2013-05-30 17:51:09 +08:00 1
我也不玩前端的,平时用到闭包最多的是写lua,给篇专门讲闭包的文章,举了各种语言(包括js)的例子:
https://www.ibm.com/developerworks/cn/linux/l-cn-closure/ |
16
emohacker OP |
17
renyuan1985 2013-05-30 17:52:22 +08:00
@switch 恩是的,我也这样理解的,不知道我理解的闭包对不对http://renyuanz.com/javascript-closure.html
|
18
heroicYang 2013-05-30 21:24:35 +08:00
直白点一句话剧透:闭包就是内部函数能访问外部的变量。如果要深究,5楼已答,但是个人觉得这个概念你越是深究反而越糊涂。
|
19
Hongmin 2013-05-30 21:36:20 +08:00
突然想到一点,关于C语言函数中的static变量。
int counter() { static unsigned v = 0; return v++; } 是不是一个闭包? |
20
davepkxxx 2013-05-30 21:39:27 +08:00
关于那个考题
var abc = (func)(); 和 var abc = (func()); 的结果当然没区别…… |
21
heroicYang 2013-05-30 21:48:43 +08:00
关于考题,还有第三种写法:
var abc = function () { return {}; }(); |
22
tangzx 2013-05-30 22:57:06 +08:00 1
闭包是离散数学中一个入门概念,表示一种作用域在有/无向图上的运算,其输入为图上一个点,输出为一个图上点的集合。
编译原理中,有些计算机语言设计为:以闭包运算来决定变量的作用域 于是,讨论这些语言时就难免讨论到闭包,于是闭包便编程一个程序员用语了 |
23
chemzqm 2013-05-30 22:59:26 +08:00
实践中能别用就别用闭包,看过太多闭包滥用,没法阅读的代码
|
25
congteng 2013-05-31 10:36:37 +08:00
最简单的闭包
var a = 1; function test(){ return a + 1; } test(); |
26
emohacker OP 理解了
@congteng 给出了五楼的例子 @renyuan1985 @heroicYang @Hongmin @davepkxxx @heroicYang @tangzx @chemzqm @slixurd thank u guys |
27
AlfredZhao 2013-05-31 21:52:27 +08:00
@switch 正解...闭包不是拿来装样子的,要真正理解才可以。Object:带有行为的数据,Closure:带有数据的行为...
|
28
emohacker OP @switch
(function( window , undefined ){ })( window ); 变成下面这样的时候就形成了闭包 (function( window , undefined ){ var abc = 'x'; var z = function(){ console.log(abc); } z(); })( window ); “一个内部函数除了可以访问自己的参数和变量,同时它也能自由访问把它嵌套在其中的父函数的参数与变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包(closure)。它是JavaScript强大表现力的来源。”----蝴蝶书 page 27 |
29
yakczh 2013-06-10 22:35:34 +08:00
闭包就是数据的作用域
|
30
emohacker OP @heroicYang 哈哈,我理解了,如果是匿名函数还有第种写法 function前加操作符 +,-,~,!
1、 (function(){ })() 2、 (function(){ }()) 3、 ~function(){ }(); |