JavaScript作用域是指變量或函數(shù)聲明的可訪問性。在JavaScript中,作用域大致分為兩種:
全局作用域:全局作用域是指在所有函數(shù)外部聲明的變量或函數(shù),可以在任何地方被訪問到。例如:
var globalVar = "I am in global scope"; function globalFunc() { console.log("I am also in global scope"); }
上面的代碼中,我們在全局作用域中聲明了一個(gè)變量globalVar和一個(gè)函數(shù)globalFunc,它們可以在任何函數(shù)內(nèi)部被訪問到,如下:
function foo() { console.log(globalVar); // "I am in global scope" globalFunc(); // "I am also in global scope" } foo();
局部作用域:局部作用域是指在函數(shù)內(nèi)部聲明的變量或函數(shù),只能被該函數(shù)內(nèi)部訪問到,外部無法訪問。例如:
function localScope() { var localVar = "I am in local scope"; function nestedFunc() { console.log("I am inside nested function"); } console.log(localVar); // "I am in local scope" nestedFunc(); } localScope(); console.log(localVar); // ReferenceError: localVar is not defined nestedFunc(); // ReferenceError: nestedFunc is not defined
在上面的代碼中,我們聲明了一個(gè)函數(shù)localScope,在其中聲明了一個(gè)變量localVar和一個(gè)函數(shù)nestedFunc,它們都只能在函數(shù)內(nèi)部被訪問到。
變量提升是JavaScript作用域中一個(gè)常見的概念。它指的是在JavaScript代碼執(zhí)行之前,變量聲明會(huì)被提升到其所在函數(shù)或全局作用域的頂部。例如:
function foo() { console.log(a); // undefined var a = "I am hoisted!"; } foo();
在上面的代碼中,我們在函數(shù)內(nèi)部聲明了一個(gè)變量a,并在console.log語句之前輸出了它的值。由于變量聲明會(huì)被提升,實(shí)際上代碼執(zhí)行時(shí)變量a并沒有被賦值,所以輸出undefined。要正確輸出字符串"I am hoisted!",應(yīng)該將console.log語句放在變量賦值語句之后。
作用域鏈?zhǔn)侵冈贘avaScript代碼中,當(dāng)訪問一個(gè)變量或函數(shù)時(shí),JavaScript引擎會(huì)先從當(dāng)前作用域開始查找,如果沒有找到則向上一級(jí)作用域查找,直到找到為止。例如:
var globalVar = "I am in global scope"; function outerFunc() { var outerVar = "I am in outer scope"; function innerFunc() { var innerVar = "I am in inner scope"; console.log(globalVar); // "I am in global scope" console.log(outerVar); // "I am in outer scope" console.log(innerVar); // "I am in inner scope" } innerFunc(); } outerFunc();
在上面的代碼中,我們在全局作用域中聲明了一個(gè)變量globalVar,在函數(shù)outerFunc中聲明了變量outerVar,在函數(shù)innerFunc中聲明了變量innerVar。在innerFunc中訪問這三個(gè)變量時(shí),JavaScript引擎會(huì)從innerFunc開始查找,先在innerFunc本身的作用域中查找,沒有找到就向外層作用域outerFunc中查找,最后在全局作用域中找到了變量globalVar。
在實(shí)際開發(fā)中,我們通常會(huì)利用作用域的特性來控制變量的可訪問性,避免變量名沖突等問題。