JavaScript 作用域是指變量在什么地方和什么條件下能被訪問。
全局作用域是在 JavaScript 中最常見的作用域,它指的是所有函數和代碼塊都可以訪問到的變量。
var a = "hello"; function test(){ console.log(a); } test(); //輸出 "hello"
局部作用域指的是在函數或者代碼塊中聲明的變量,在函數或者代碼塊之外是無法訪問的。
function test(){ var a = "hello"; console.log(a); } test(); //輸出 “hello” console.log(a); //輸出 "Uncaught ReferenceError: a is not defined"
函數作用域指的是在函數中聲明的變量,只能在函數內部被訪問到。
function test(){ var a = "hello"; function innerTest(){ console.log(a); } innerTest(); //輸出 “hello” } test();
作用域鏈是指一個變量從內部作用域向外部作用域查找的過程。
var a = "hello"; function outer(){ var a = "hi"; function inner(){ console.log(a); //先在內部作用域查找 a,輸出 "hi" } inner(); } outer();
如果內部作用域沒有找到變量,會繼續在外部作用域繼續查找,直到找到全局變量或者抵達最外層作用域。
var a = "hello"; function outer(){ function inner(){ console.log(a); //在內部作用域和外部作用域都未找到變量 a,輸出 "hello" } inner(); } outer();
閉包是指函數和其詞法環境的組合,可以在函數內部引用函數外部的變量。
function outer(a){ function inner(){ console.log(a); //在函數內部引用外部變量 a,輸出 "hello" } return inner; } var innerFunc = outer("hello"); innerFunc();
閉包可以用來隱藏變量或者函數,同時可以緩存計算結果避免重復計算。
function fibonacci(){ var cache = {}; return function(n){ if(n in cache){ return cache[n]; }else{ if(n < 2){ cache[n] = n; return n; }else{ cache[n] = fibonacci(n-1) + fibonacci(n-2); return cache[n]; } } } } var fib = fibonacci(); console.log(fib(10)); //輸出 55,計算結果已被緩存
總之,JavaScript 作用域是非常重要的概念,對于變量和函數的訪問有著重要的影響。