做用域及做用域鏈

1.什麼是做用域函數

簡單的來講就是,做用域就是指變量的適用範圍;spa

2.做用域還分全局做用域和函數做用域orm

全局做用域是window:全局變量,他是隨處可見的,能夠反覆使用,可是他的缺點是,會使全局污染對象

函數做用域:局部變量,僅在函數內能夠用,不能夠反覆使用ip

這是咱們簡單談到的內存

3.下面咱們來看變量的做用域作用域

變量的做用域無非就是兩種:全局變量和局部變量。 it

全局變量做用域:io

這個咱們相對咱們應該好理解些,全局嘛,咱們只要不在局部裏面均可以訪問到console

局部做用域: 

和全局做用域相反,局部做用域通常只在固定的代碼片斷內可訪問到,而對於函數外部是沒法訪問的,最多見的例如函數內部,

在這須要注意的是,函數內部聲明變量的時候,必定要使用var命令。若是不用的話,你實際上聲明瞭一個全局變量!

<scritpt>

function fun(){

a = 100;

}

fun();

console.log(a);//此時的a是等於100

</script>

爲何呢?

這就是不用var關鍵字的後果,雖然你是想聲明一個局部變量的可是你沒有使用var關鍵字,因此致使這個a變成了全局變量(這是我簡單寫的一個變量名a,通常咱們在寫代碼時,要規範化)

咱們重點來看一下局部的

<scritpt>

var  a  = 200;

function fun(){

console.log(b);//undefined

var b= 100;

console.log(b);//100

}

fun();

console.log(a);//200

</script>

【這又是爲何呢?

來,咱們繼續來分析首先咱們來看這裏面那些事全局變量,那是局部變量,咱們從上往下看,a就是全局變量(還不明白的請看上面的全局變量的定義)繼續找咱們會看到console.log(b);//undefined和局部變量 var b= 100;有人就會問,不是局部變量b有值嗎,爲何兩個輸出b的值不同呢?第一個輸出就是隻要函數內定義了一個局部變量,函數在解析的時候都會將這個變量「提早聲明」; (這句話的意思就是當有局部變量的時候,函數在調用以前會把變量提早,值留在原地這個過程,因此此時的變量是沒有值得,因此纔是空)繼續往下走此時var b= 100;因此才輸出100的,下面全局變量的輸出就不用多說了。】這個還不懂的下去本身多練習

1.變量在當前環境now、內部環境f1,內部深層環境f2/f3...都起做用的現象造成了一個鏈條,這個鏈條就成爲變量的"做用域鏈"

 

 
 

2. 做用域鏈的做用

    2.1 變量必須"先聲明,後使用"

        函數能夠"先使用,後聲明",緣由是函數有預加載的過程(函數聲明先於其餘執行代碼進入內存).本質仍是函數聲明在前,使用在後.

    2.2 內部環境變量能夠訪問外部環境的變量,反之否則.

       環境: 每個函數內部都是一個環境,最外邊是全局環境.

        類型: 函數環境、全局環境

    2.3 變量的做用域是聲明時以爲的,而不是運行時

3. AO活動對象 

    Active Object 活動對象(抽象的)

    執行環境:

        js代碼執行是有環境的(全局環境,函數內部環境)

        該環境定義了其有權訪問的其餘數據

        環境有一個與之關聯的"活動對象AO"

        環境中因此的變量和函數都是活動對象AO的屬性

        全局環境是最外圍的執行環境,活動對象是window對象

        執行環境中的代碼執行完畢後就被銷燬

4. 變量的類型及優先 

    執行環節能夠訪問變量的類型及優先順序

    內部變量>>>內部函數>>>形參>>>外部變量(函數,形參);

相關文章
相關標籤/搜索