何為作用域
任何編程語(yǔ)言都有作用域的概念恶座,簡(jiǎn)單來(lái)說篷牌,作用域就是變量與函數(shù)的可訪問范圍恶迈,即作用域控制著變量與函數(shù)的可見性和生命周期。
js的作用域是靠函數(shù)來(lái)形成的跃捣,也就是說一個(gè)函數(shù)的變量在函數(shù)外不可以訪問漱牵。
1.全局作用域
任何地方都能訪問到的對(duì)象擁有全局作用域。
1.1函數(shù)外面定義的變量擁有全局作用域
var n = 2;
function fn() {
var a = 1;
return a;
}
console.log(fn()); //1
console.log(n); //2
console.log(a); //報(bào)錯(cuò)error
1.2未定義直接賦值的變量自動(dòng)聲明為擁有全局作用域
var n = 2;
function fn() {
a = 1;
return a;
}
console.log(fn()); //1
console.log(n); //2
console.log(a); //1
2.局部作用域
局部作用域一般只在固定的代碼片段內(nèi)可訪問到疚漆,最常見的例如函數(shù)內(nèi)部酣胀,所以在一些地方會(huì)把這種作用域成為函數(shù)作用域。
圖一中愿卸,a是函數(shù)內(nèi)部聲明并賦值灵临,擁有局部作用域,只能帶函數(shù)fn內(nèi)部使用趴荸,在fn外部使用就會(huì)報(bào)錯(cuò),這就是局部作用域的特性宦焦,外部無(wú)法訪問发钝。
作用域鏈
通俗地講,當(dāng)聲明一個(gè)函數(shù)時(shí)波闹,局部作用域一級(jí)一級(jí)向上包起來(lái)酝豪,就是作用域鏈。
當(dāng)執(zhí)行函數(shù)時(shí)精堕,總是先從函數(shù)內(nèi)部找尋局部變量
如果內(nèi)部找不到(函數(shù)的局部作用域沒有)孵淘,則會(huì)向創(chuàng)建函數(shù)的作用域(聲明函數(shù)的作用域)尋找,依次向上
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //1
原因:先執(zhí)行fn1歹篓,返回值是fn3的函數(shù)表達(dá)式瘫证,此時(shí)fn1的局部作用各變量已經(jīng)賦值完畢揉阎;將fn3賦值給fn,即fn=function (){var a=4;fn2()}背捌;執(zhí)行fn毙籽,調(diào)用執(zhí)行fn2,fn2下沒有定義a往上層作用域找毡庆,找到var a = 1坑赡,所以 console.log(a)等于1。