初步理解闭包
1.什么是闭包
借用MDN的定义
闭包是指这样的*作用域*,它包含有一个*函数*,这个函数可以调用被这个作用域所*封闭*的变量、函数或者闭包等内容。通常我们通过闭包所对应的函数来获得对闭包的访问。
2.闭包产生的背景
我们知道在js中 内部作用域能访问外部作用域,外部作用域不能访问内部作用域。
如果现在我有一个很重要的变量a=1(不能改,改了程序就崩溃,但是我部分时候需要全局调用),我不想让人误改。如果我使用全局变量,被人误改了=>game over
如果我用局部变量,全局又不能调用,我该怎么办?
我们可以在a所在作用域里面加一层作用域,这样里层作用域能访问a,但是这样还不够,全局还是不能访问,我们还要在里层作用域里面将其暴露出来(类似的概念参考函数的setter. getter)
var b= function(){
var a=1 //a非常重要
var take =function(){ //添加take函数,里面的作用域相对b的作用域为内部作用域
return a //内部作用域访问外层的参数, ***并暴露出来****
}
return take() // ***暴露并执行内层函数
}
b() //输出1 即a的值
3闭包作用
通过上面代码我们就创造了一个闭包 ,通过这个闭包 我们可以达到 窖藏?(隐藏但是是一种保护我们能随时获取)一个变量的目的
我们再看一个例子
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
console.log(myFunc)
muFunc ()//输出Mozilla
一般我们执行完一个函数以后,局部活动对象会被销毁
但当我们执行完makeFunc() 以后name这个变量在内存中还是存在的 当makeFunc()函数执行完毕后,其执行环境的作用域链被销毁,但它的活动对象仍然会留在内存中当myFunc()执行完的时候 实际上就是di spalyName执行完的时候 name此时才被销毁了
4闭包缺陷
闭包只能取得包含函数中任意变量的最后一个值, 比如循环i值只能取最后一个,解决途径就是立即执行函数的运用
5参考资料
高级程序设计