
1 typing 2013-05-30 16:11:34 +08:00 对于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 我有一个专门说闭包的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 我也不玩前端的,平时用到闭包最多的是写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 +8: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 闭包是离散数学中一个入门概念,表示一种作用域在有/无向图上的运算,其输入为图上一个点,输出为一个图上点的集合。 编译原理中,有些计算机语言设计为:以闭包运算来决定变量的作用域 于是,讨论这些语言时就难免讨论到闭包,于是闭包便编程一个程序员用语了 |
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 @dvepkxxx @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(){ }(); |