閉包

**閉包**

```

閉包的三大特點為:

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();

```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容