**閉包**
```
閉包的三大特點為:
1烂瘫、函數(shù)嵌套函數(shù)
2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量
3奇适、參數(shù)和變量不會被回收坟比。
列:
function test(){
? ? var a=1;
? ? return function(){
? ? ? alert(a);
? ? }
? }
? var try=test();
? try();//彈出a的值
這個例子中,變量a在test方法外部是無法訪問的嚷往,但test方法里面葛账,嵌套了一個匿名函數(shù),通過return返回皮仁,test作用域中的變量a籍琳,
可以在匿名函數(shù)中訪問菲宴。并且當test方法執(zhí)行后,變量a所占內(nèi)存并不會釋放趋急,以達到嵌套的函數(shù)還可以訪問的目的喝峦。
```
閉包作用
```
閉包的作用在于,可以通過閉包宣谈,設計私有變量及方法愈犹。
舉例來說:在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;
? ? }
}
```
全局
```
最外層函數(shù)定義的變量擁有全局作用域漩怎,即對任何內(nèi)部函數(shù)來說,都是可以訪問的
列:
var outerVar = "outer";
? ? ? function fn(){
? ? ? ? console.log(outerVar);
? ? ? }
? ? ? fn();//result:outer
```
局部
```
和全局作用域相反嗦嗡,局部作用域一般只在固定的代碼片段內(nèi)可訪問到勋锤,而對于函數(shù)外部是無法訪問的,最常見的例如函數(shù)內(nèi)部
列:
function fn(){
? ? ? ? var innerVar = "inner";
? ? ? }
? ? ? fn();
? ? ? console.log(innerVar);// ReferenceError: innerVar is not defined
```
**作用域鏈**
```
在JavaScript中侥祭,函數(shù)也是對象叁执,實際上,JavaScript里一切都是對象矮冬。函數(shù)對象和其它對象一樣谈宛,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性。其中一個內(nèi)部屬性是[[Scope]]胎署,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對象的集合吆录,這個集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問琼牧。
列:
當一個函數(shù)創(chuàng)建后恢筝,它實際上保存一個作用域鏈,并且作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充巨坊。例如定義下面這樣一個函數(shù)
function func() {
? ? ? ? ? ? var num = 1;
? ? ? ? ? ? alert(num);
? ? ? ? }
? ? ? ? func();
```