**作用域鏈**
**詞法作用域**
函數只會看到該變量的最終狀態.
利用閉包突破作用域鏈



_________________________

這個n屬于全局,該函數后來升為全局函數,保留有對f()作用域的訪問權。
如果一個函數需要在其父級函數返回之后留住對父級作用域的鏈接的話,就必須要為此建立一個閉包。
函數所綁定 的是作用域本身,而非該作用域中的變量或變量當前所返回的值。

~~~
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"
~~~