作用域是指代碼中定義變量的區(qū)域。作用域規(guī)定了如何查找變量,也就是確定當(dāng)前代碼對(duì)變量的訪問(wèn)權(quán)限。
靜態(tài)作用域和動(dòng)態(tài)作用域
靜態(tài)作用域是指函數(shù)的作用域在函數(shù)定義時(shí)就已經(jīng)確定了,而動(dòng)態(tài)作用域是指函數(shù)的作用域在運(yùn)行時(shí)才確定吏夯。下面是一段代碼:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
如果這段代碼使用靜態(tài)作用域的方式訪問(wèn)變量此蜈,那么執(zhí)行foo()函數(shù)時(shí),首先查看函數(shù)內(nèi)是否存在局部變量value的定義噪生,如果沒(méi)有裆赵,則查找之前的代碼,也就是var value = 1;
跺嗽,查找到了value的定義為1战授,因此輸出1。
如果這段代碼使用動(dòng)態(tài)作用域的方式訪問(wèn)變量桨嫁,那么執(zhí)行foo()函數(shù)時(shí)植兰,首先依舊從函數(shù)內(nèi)部查找是否存在局部變量value的定義,如果沒(méi)有璃吧,那么從調(diào)用方bar()函數(shù)的作用域中查找楣导,找到了var value = 2;
,因此輸出2畜挨。
JavaScript采用靜態(tài)作用域的方式訪問(wèn)變量筒繁,因此這個(gè)例子輸出為1。
常見(jiàn)的采用動(dòng)態(tài)作用域的語(yǔ)言是bash巴元。