[js] 大家聊聊 “闭包--Closure” 这个前端面试必问的永恒话题

2013-05-30 15:58:55 +08:00
 emohacker
这个永恒的话题一般是这样的:

你是如何理解闭包的?什么情况下用闭包?

我把闭包简单理解为,是函数返回后并没有释放内存中的资源。

个人使用情况:
1、封装,对象有私有属性或方法不希望外部直接访问的时候。
2、缓存。
3、类似独立的命名空间,避免变量污染到全局的情况,比如jQuery中
(function( window , undefined ){

})( window );

另一考题,以下这两种写法的效果是一样的,为什么?

var abc = (function(){
return{.......};
})();

var abc = (function(){
return{.......};
}());
7600 次点击
所在节点    JavaScript
30 条回复
heroicYang
2013-05-30 21:48:43 +08:00
关于考题,还有第三种写法:
var abc = function () {
return {};
}();
tangzx
2013-05-30 22:57:06 +08:00
闭包是离散数学中一个入门概念,表示一种作用域在有/无向图上的运算,其输入为图上一个点,输出为一个图上点的集合。

编译原理中,有些计算机语言设计为:以闭包运算来决定变量的作用域

于是,讨论这些语言时就难免讨论到闭包,于是闭包便编程一个程序员用语了
chemzqm
2013-05-30 22:59:26 +08:00
实践中能别用就别用闭包,看过太多闭包滥用,没法阅读的代码
slixurd
2013-05-31 01:11:45 +08:00
@Hongmin 我觉得这样不行吧= =
不然java的匿名内部类怎么办?
congteng
2013-05-31 10:36:37 +08:00
最简单的闭包
var a = 1;
function test(){
return a + 1;
}

test();
emohacker
2013-05-31 11:23:06 +08:00
理解了

@congteng 给出了五楼的例子

@renyuan1985
@heroicYang
@Hongmin
@davepkxxx
@heroicYang
@tangzx
@chemzqm
@slixurd

thank u guys
AlfredZhao
2013-05-31 21:52:27 +08:00
@switch 正解...闭包不是拿来装样子的,要真正理解才可以。Object:带有行为的数据,Closure:带有数据的行为...
emohacker
2013-06-10 22:30:53 +08:00
@switch

(function( window , undefined ){

})( window );

变成下面这样的时候就形成了闭包

(function( window , undefined ){
var abc = 'x';
var z = function(){
console.log(abc);
}
z();
})( window );

“一个内部函数除了可以访问自己的参数和变量,同时它也能自由访问把它嵌套在其中的父函数的参数与变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包(closure)。它是JavaScript强大表现力的来源。”----蝴蝶书 page 27
yakczh
2013-06-10 22:35:34 +08:00
闭包就是数据的作用域
emohacker
2013-06-10 22:41:12 +08:00
@heroicYang 哈哈,我理解了,如果是匿名函数还有第种写法 function前加操作符 +,-,~,!
1、
(function(){

})()
2、
(function(){

}())
3、
~function(){

}();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/70662

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX