作用域是指代碼中定義變量的區(qū)域。作用域規(guī)定了如何查找變量叔锐,也就是確定當(dāng)前代碼對(duì)變量的訪問權(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)作用域的方式訪問變量讨盒,那么執(zhí)行foo()函數(shù)時(shí),首先查看函數(shù)內(nèi)是否存在局部變量value的定義齿梁,如果沒有催植,則查找之前的代碼肮蛹,也就是var value = 1;
,查找到了value的定義為1创南,因此輸出1伦忠。
如果這段代碼使用動(dòng)態(tài)作用域的方式訪問變量,那么執(zhí)行foo()函數(shù)時(shí)稿辙,首先依舊從函數(shù)內(nèi)部查找是否存在局部變量value的定義昆码,如果沒有,那么從調(diào)用方bar()函數(shù)的作用域中查找邻储,找到了var value = 2;
赋咽,因此輸出2。
JavaScript采用靜態(tài)作用域的方式訪問變量吨娜,因此這個(gè)例子輸出為1脓匿。
常見的采用動(dòng)態(tài)作用域的語言是bash。