**作用域链**
**词法作用域**
函数只会看到该变量的最终状态.
利用闭包突破作用域链
![](https://box.kancloud.cn/6311678c6262538fad6de94627161348_241x211.png)
![](https://box.kancloud.cn/8d4680d68269171d114316c0d5069d1a_223x219.png)
![](https://box.kancloud.cn/7d7be18dece035ed8085e9e3bb52e17f_170x253.png)
_________________________
![](https://box.kancloud.cn/0b7c7a210ca39286c03b1b7e36b93531_155x183.png)
这个n属于全局,该函数后来升为全局函数,保留有对f()作用域的访问权。
如果一个函数需要在其父级函数返回之后留住对父级作用域的链接的话,就必须要为此建立一个闭包。
函数所绑定 的是作用域本身,而非该作用域中的变量或变量当前所返回的值。
![](https://box.kancloud.cn/fea668e567a1c04d8e232bde53f9295d_154x151.png)
~~~
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = function() {
return i;
}
}
return a;
}
var a=f();
alert(a[1]());
均为3.
~~~
~~~
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = (function(x) {
return function(){
return x;
}
})(i);
}
return a;
}
var a=f();
console.log(a[0]());
console.log(a[1]());
console.log(a[2]());
~~~
~~~
function f() {
function makeClosure(x) {
return function*() {
return x;
}
}
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = makeClosure(i);
}
return a;
}
~~~
**setvalue/getvalue**
所有一切都是通过一个匿名函数来实现的,两个全局函数,来确保局部变量secret的不可直接访问性。
~~~
var getValue, setValue;
(function() {
var secret = 0;
getValue = function() {
return secret;
};
setValue = function(v) {
secret = v;
};
})()
getValue();
//0;
//setValue(345);
//getValue();
//345
~~~
______________
~~~
function setup(x) {
var i = 0;
return function() {
return x[i++];
};
}
var next=setup(['a','b','c']);
next()
"a"
next()
"b"
next()
"c"
~~~