目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
闭包是JS语言的一个特色,也是一个难点,很多高级应用中都要依赖闭包实现。
一言蔽之,闭包就是:「函数」和「函数内部能访问到的变量」(也叫环境)的总和。
高程上的解释是:
闭包是指有权访问另一个函数作用域中的变量的函数.
我们把定语去掉可以得出,闭包实际上就是一个函数,但是还有一个特点,就是它可以访问另一个函数作用域中的变量。
所以闭包是由两部分组成:【函数】和【函数可以访问到的变量】
function foo(){
var local = '变量';
function a(){
console.log(local);
}
}
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。
举个粟子,当我们定义了一个变量,想要调用它,但又想隐藏起来不被别人无意修改到怎么做?
function foo(){
var name = '狗蛋';
return function (){
return name;
}
}
var a = foo();
a();
那问题来了,我们都知道在函数作用域链中,内部作用域可以访问外部的作用域,外部的作用域无法访问内部的作用域。
但在这个例子中,函数foo里声明的变量为什么可以在外部访问到呢?
当某个函数被调用时,会创建一个执行环境,及相应的作用域链。无论什么时候在函数中访问一个变量时,就会从作用域中搜索具有相应名字的变量。
一般来说,当函数执行完毕之后,局部活动对象就会被毁,内存中仅保存全局作用域,但是,闭包情况又有不同。
比如上述函数foo,在执行完毕之后,活动对象不会被销毁,因为匿名函数的作用域仍然在引用这个活动对象。要直到匿名函数被销毁后,函数foo的活动对象才会被销毁。
所谓的内存泄露是指你用不到(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。 但闭包里面的变量就是我们需要的变量,所以说闭包不会造成内存泄露。 这个谣言是如何来的? 因为IE 有 bug,IE 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。所以导致了内存泄露。 但这是是 IE 的问题,不是闭包的问题。
感谢大家观看
BY : 钟楚炯