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