JavaScript語言中,作用域是指程序中變量的生命周期和可訪問性。作用域有全局作用域和局部作用域兩種,其作用主要是限制變量的可見性,避免變量重名沖突。
JavaScript中的全局作用域是指整個程序的作用域,對于在全局作用域中聲明的變量,在程序執行的任何地方都可以被調用訪問。例如,在HTML頁面中使用JavaScript編寫全局作用域的變量:
var a = 1; function test() { console.log(a); }
全局作用域變量a可以被任何函數調用,例如:
function test1() { console.log(a); } test1(); //輸出1
局部作用域是指變量的訪問僅限于所在函數或代碼塊內部。例如,在函數中聲明一個變量:
function test2() { var b = 2; console.log(b); } test2(); //輸出2 console.log(b); //Uncaught ReferenceError: b is not defined
在函數外部無法訪問變量b,因為其作用域僅限于test2函數中。這樣做的好處是可以避免變量名的沖突。
JavaScript中的變量提升是指在函數內部,變量聲明會被提升到函數頂部。例如:
function test3() { console.log(a); //undefined var a = 3; console.log(a); //3 }
雖然變量a在調用console.log()函數之前被聲明,但是JavaScript解釋器會將變量聲明提升到函數頂部,所以第一次console.log()的輸出結果為undefined。
JavaScript中的閉包是指函數內部定義的函數可以訪問到函數外部的變量。例如:
function test4() { var c = 4; function inner() { console.log(c); } return inner; } var fn = test4(); fn(); //輸出4
函數inner可以訪問到test4中的變量c,即使test4已經執行完畢,閉包依然能夠訪問到其定義時的作用域。
在ES6之后,JavaScript引入了塊級作用域的概念,使用let或const關鍵字聲明的變量僅限于塊級作用域內部。例如:
function test5() { let d = 5; if (true) { let d = 6; console.log(d); //6 } console.log(d); //5 } test5();
在if代碼塊中聲明的變量d僅限于該代碼塊中,函數外部聲明的變量d不會受到影響。
總結:JavaScript中的作用域控制是非常重要的,能夠有效避免變量名沖突和變量提升問題,而閉包和塊級作用域的引入則更加靈活方便。
下一篇mamp打開php