作用域
??????作用域,即變量(變量作用域又稱上下文)和函數(shù)生效(能被訪問)的區(qū)域或集合
作用域決定了代碼塊中變量和其他資源的可見性
function demo(){
let variable = "變量";
}
demo();//要先執(zhí)行這個函數(shù),否則根本不知道里面是啥
console.log(variable)//訪問不到 不可見
我們一般將作用域分成:
- 我們一般將作用域分成:
- 全局作用域
- 函數(shù)作用域
- 塊級作用域
全局作用域
??????任何不在函數(shù)中或是大括號中聲明的變量,都是在全局作用域下,全局作用域下聲明的變量可以在程序的任意位置訪問
//全局變量
var greeting = '全局變量'
function greet(){
console.log(greeting)
}
greet()
函數(shù)作用域
??????函數(shù)作用域也叫局部作用域,如果一個變量是在函數(shù)內(nèi)部聲明的它就在一個函數(shù)作用域下面。這些變量只能在函數(shù)內(nèi)部訪問,不能在函數(shù)以外去訪問
function greet() {
var greeting = 'Hello World!';
console.log(greeting);
}
// 打印 'Hello World!'
greet();
// 報錯: Uncaught ReferenceError: greeting is not defined
console.log(greeting);
可見上述代碼中在函數(shù)內(nèi)部聲明的變量或函數(shù),在函數(shù)外部是無法訪問的,這說明在函數(shù)內(nèi)部定義的變量或者方法只是函數(shù)作用域
塊級作用域
ES6引入了let和const關(guān)鍵字,和var關(guān)鍵字不同,在大括號中使用let和const聲明的變量存在于塊級作用域中。在大括號之外不能訪問這些變量
{
// 塊級作用域中的變量
let greeting = 'Hello World!';
var lang = 'English';
console.log(greeting); // Prints 'Hello World!'
}
// 變量 'English'
console.log(lang);
// 報錯:Uncaught ReferenceError: greeting is not defined
console.log(greeting);
二、詞法作用域
??詞法作用域,又叫靜態(tài)作用域,變量被創(chuàng)建時就確定好了,而非執(zhí)行階段確定的。也就是說我們寫好代碼時它的作用域就確定了,JavaScript 遵循的就是詞法作用域
var a = 2;
function foo(){
console.log(a)
}
function bar(){
var a = 1;
foo();
}
bar()
由于JavaScript遵循詞法作用域,相同層級的 foo 和 bar 就沒有辦法訪問到彼此塊作用域中的變量,所以輸出2
三、作用域鏈
??????當在Javascript中使用一個變量的時候,首先Javascript引擎會嘗試在當前作用域下去尋找該變量,如果沒找到,再到它的上層作用域?qū)ふ?,以此類推直到找到該變量或是已?jīng)到了全局作用域
如果在全局作用域里仍然找不到該變量,它就會在全局范圍內(nèi)隱式聲明該變量(非嚴格模式下)或是直接報錯
把作用域比喻成一個建筑,這份建筑代表程序中的嵌套作用域鏈,第一層代表當前的執(zhí)行作用域,頂層代表全局作用域
變量的引用會順著當前樓層進行查找,如果找不到,則會往上一層找,一旦到達頂層,查找的過程都會停止文章來源:http://www.zghlxwxcb.cn/news/detail-477376.html
var sex = '男';
function person(){
var name = '李四';
function student(){
var age = 18;
console.log(name);
console.log(sex);
}
student();
console.log(age);
}
person();
分析:文章來源地址http://www.zghlxwxcb.cn/news/detail-477376.html
- student 函數(shù)內(nèi)部屬于最內(nèi)層作用域,找不到 name,向上一層作用域 person函數(shù)內(nèi)部找,找到了輸出“”
- student內(nèi)部輸出 sex時找不到,向上一層作用域 person函數(shù)找,還找不到繼續(xù)向上一層找,即全局作用域,找到輸出
- 在 person 函數(shù)內(nèi)部輸出 age 時找不到,向上一層作用域找,即全局作用域,還是找不到則 報錯
到了這里,關(guān)于作用域鏈的理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!