什么是闭包
闭包的作用
闭包的例子
什么是闭包
|
|
「函数」和「函数内部能访问到的变量」的总和,就是一个闭包。
上面代码中的函数fn,它里面可以访问到 local 变量,那么函数fn和local变量形成一个闭包。
闭包的作用
闭包的作用是用来「间接访问一个变量」。换句话说,「隐藏一个变量」。
利用闭包可以将函数内部的变量传递到外部,从而实现在外部访问另一个函数内部的局部变量。
|
|
闭包的使用
如果person等于window.person,别人就可以访问到person内的数据,这样看起来很不妥。万一别人不小心修改了person内的数据怎么办。所以我们不能让别人「直接访问」这个变量。怎么办呢?
用局部变量。
但是用局部变量别人又访问不到,怎么办呢?
如何从外部读取函数内部的局部变量?暴露一个访问器(在函数的内部,再定义一个函数),让别人可以「间接访问」。
|
|
上面代码中,利用闭包,让别的函数无法获取和修改person的name和age,只能通过addAge间接给age加一,从而隐藏并保护了person内的数据。
再举个例子:123456789101112131415var xxx = (function(){ var a = 1; return { getA:function(){ return a; }, addA:function(){ a++; return a; } }})();xxx.addA();xxx.getA();
总结
- 立即执行函数使得person无法被外部访问
- 闭包使得内部的匿名函数可以访问到person
- window.addAge保存了匿名函数的地址,该匿名函数用来操作person
- 从而,任何地方都可以通过window.addAge里的方法操作person,但却无法访问到person的详细数据
优化,去除window
|
|
|
|
上面代码可以写成下面这样,这样写可以清楚知道return的内容,但是需要在上面取名字:
|
|
再看一个例子
|
|
面试题
正确打印出下标
|
|
用闭包:
|
|
闭包还有一种写法:
|
|
方法三:将下标index作为对象的一个属性,添加到每个数组元素中
|
|