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