JavaScript作用域是指程序中聲明的變量、函數和對象等的可訪問范圍。一個變量在不同的作用域中可以具有不同的值。本文將對JavaScript作用域進行分析。
在JavaScript中有兩種作用域:全局作用域和局部作用域。
//全局作用域 var x = 10; function globalScope() { console.log(x); //輸出10 }
在全局作用域中聲明的變量或函數可以在程序的任何地方調用。
//局部作用域 function localScope() { var y = 5; console.log(y); //輸出5 } localScope(); console.log(y); //輸出undefined
在局部作用域中聲明的變量或函數只能在該作用域內訪問,外部無法訪問。上面的代碼中,在localScope函數內部聲明了一個變量y,該變量只能在該函數內部訪問,程序在函數外部調用時會輸出undefined。
在JavaScript中,函數可以嵌套定義。嵌套的函數可以訪問外部函數的變量和函數。
function outer() { var a = 1; function inner() { var b = 2; console.log(a + b); //輸出3 } inner(); } outer();
在上面的代碼中,outer函數內定義了變量a和函數inner,在inner函數內定義了變量b。在inner函數內部,a和b變量都可以訪問。在調用outer函數時,會輸出3。
在JavaScript中,還有一種特殊的作用域:塊級作用域。塊級作用域僅在代碼塊內部有效。
function blockScope() { var x = 1; if (true) { let x = 2; console.log(x); //輸出2 } console.log(x); //輸出1 } blockScope();
在上面的代碼中,if語句內部使用了let關鍵字聲明了一個變量x,在if語句外部也聲明了一個變量x。在if語句內部,使用let聲明變量x會創建一個新的塊級作用域,外部的變量x不會受到影響。在調用blockScope函數時,會輸出2和1。
在JavaScript中,作用域鏈是指程序中所有作用域的嵌套關系。每一個作用域都會有一個指向外層作用域的引用。在查找變量時,JavaScript將沿著作用域鏈向外查找,直到找到變量或查找到全局作用域為止。
var x = 1; function outer() { var y = 2; function inner() { var z = 3; console.log(x + y + z); //輸出6 } inner(); } outer();
在上面的代碼中,outer函數內定義了變量y和函數inner,在inner函數內定義了變量z。在inner函數內部,沿著作用域鏈向外查找時會依次查找變量z、變量y和變量x。在調用outer函數時,會輸出6。
總之,JavaScript作用域是程序中聲明的變量、函數和對象等的可訪問范圍。作用域可以分為全局作用域和局部作用域。函數可以嵌套定義,在內部的函數可以訪問外部函數的變量和函數。塊級作用域僅在代碼塊內部有效。作用域鏈是沿著作用域鏈向外查找變量的過程。