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.1 變量必須"先聲明,後使用"
函數能夠"先使用,後聲明",緣由是函數有預加載的過程(函數聲明先於其餘執行代碼進入內存).本質仍是函數聲明在前,使用在後.
2.2 內部環境變量能夠訪問外部環境的變量,反之否則.
環境: 每個函數內部都是一個環境,最外邊是全局環境.
類型: 函數環境、全局環境
2.3 變量的做用域是聲明時以爲的,而不是運行時
Active Object 活動對象(抽象的)
執行環境:
js代碼執行是有環境的(全局環境,函數內部環境)
該環境定義了其有權訪問的其餘數據
環境有一個與之關聯的"活動對象AO"
環境中因此的變量和函數都是活動對象AO的屬性
全局環境是最外圍的執行環境,活動對象是window對象
執行環境中的代碼執行完畢後就被銷燬
執行環節能夠訪問變量的類型及優先順序
內部變量>>>內部函數>>>形參>>>外部變量(函數,形參);