**閉包**
```
閉包的三大特點為:
1、函數嵌套函數
2、內部函數可以訪問外部函數的變量
3、參數和變量不會被回收。
列:
function test(){
? ? var a=1;
? ? return function(){
? ? ? alert(a);
? ? }
? }
? var try=test();
? try();//彈出a的值
這個例子中,變量a在test方法外部是無法訪問的,但test方法里面,嵌套了一個匿名函數,通過return返回,test作用域中的變量a,
可以在匿名函數中訪問。并且當test方法執(zhí)行后,變量a所占內存并不會釋放,以達到嵌套的函數還可以訪問的目的。
```
閉包作用
```
閉包的作用在于,可以通過閉包,設計私有變量及方法。
舉例來說:在java中創(chuàng)建perosn類,含有私有變量name。
public class Person{
? ? private String name='wy';
? ? public Person(val){
? ? ? name=val;
? ? }
? ? public void setName(val){
? ? ? name=val;
? ? }
? ? public String getName(){
? ? ? return name;
? ? }
}
```
全局
```
最外層函數定義的變量擁有全局作用域,即對任何內部函數來說,都是可以訪問的
列:
var outerVar = "outer";
? ? ? function fn(){
? ? ? ? console.log(outerVar);
? ? ? }
? ? ? fn();//result:outer
```
局部
```
和全局作用域相反,局部作用域一般只在固定的代碼片段內可訪問到,而對于函數外部是無法訪問的,最常見的例如函數內部
列:
function fn(){
? ? ? ? var innerVar = "inner";
? ? ? }
? ? ? fn();
? ? ? console.log(innerVar);// ReferenceError: innerVar is not defined
```
**作用域鏈**
```
在JavaScript中,函數也是對象,實際上,JavaScript里一切都是對象。函數對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],該內部屬性包含了函數被創(chuàng)建的作用域中對象的集合,這個集合被稱為函數的作用域鏈,它決定了哪些數據能被函數訪問。
列:
當一個函數創(chuàng)建后,它實際上保存一個作用域鏈,并且作用域鏈會被創(chuàng)建此函數的作用域中可訪問的數據對象填充。例如定義下面這樣一個函數
function func() {
? ? ? ? ? ? var num = 1;
? ? ? ? ? ? alert(num);
? ? ? ? }
? ? ? ? func();
```