写在前面
百度上有很多种文章解释闭包的,但90%的文章对闭包都解释不清,我之所以敢这么说,肯定是有这么说的底气的。原因如下:1.有能解释得清闭包的形式是什么? 2.有能真正解释得清为什么会出现闭包的吗?3.有能真正解释得清闭包背后的形成机制吗?
闭包的形式是什么
关于闭包,有一句话是“所有的函数都是闭包”,这句话我实在不敢苟同,那干脆函数直接叫闭包得了,或许这句话从某种意义上说得通,但对于开发人员来说,你要这假大空的说法干什么,你会用闭包吗?还是不会。
那么我对于闭包的看法是,闭包的出现的形式如下:
function fn(){
var max=10;
return function bar(x){
if(x>max)
{
alert(x);
}
}
}
var f1=fn();
f1(15);//15
用自然语言来说就是:
(1)定义普通函数 A
(2)在 A 中定义普通函数 B
(3)在 A 中返回 B
(4)执行 A, 并把 A 的返回结果赋值给变量 C
(5)执行 C
用“return”作为桥梁,链接A外的变量C和A内的变量B。
为什么会出现闭包
很多解释闭包的文章上来就从执行上下文,作用域来解释,而忘记了为什么要出现闭包这个概念,一门编程语言出现一个概念肯定是用来解决一个问题的,那这个问题是什么?
我认为闭包所要解决的问题是实现私有变量。
<script type="text/javascript">
var foo=(function(){
var a="a";
//闭包内的函数可以访问变量a,而a变量对于外界却是隐藏的
return {
//定义接口访问变量a.类似java中的get函数
get_a:function (){
return a;
},
//定位接口设置变量a,类似java中的set函数
set_a:function(new_a){
a=new_a;
}
};
}());
console.log(foo.get_a()); //a
console.log(foo.a);//undefined,无法通过foo.a访问变量a,所以说undefined
foo.set_a("ab");
console.log(foo.get_a());//ab
</script>
关于闭包背后的形成机制
百度上90%的文章对于执行上下文,作用域,闭包的形成原因的解释是不正确的,对此,我已经写了两个系列的文章,这些文章都收录在 厚积薄发—从此再也不用担心闭包问题
另外,如果想看全英文的最权威(也是最难理解的)关于闭包,执行上下文,作用域的解释可以看国外系列文章 ECMA-262-3 in detail. Chapter 1. Execution Contexts.