作用域
作用域,即變量(變量作用域又稱上下文)和函數(shù)生效(能被訪問(wèn))的區(qū)域或集合,作用域決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)性。
function myFunction() {
let inVariable = "函數(shù)內(nèi)部變量";
}
myFunction();//要先執(zhí)行這個(gè)函數(shù),否則不知道里面是什么
console.log(inVariable); // Uncaught ReferenceError: inVariable is not defined
函數(shù)myFunction內(nèi)部創(chuàng)建一個(gè)inVariable變量,在全局訪問(wèn)這個(gè)變量的時(shí)候,系統(tǒng)會(huì)報(bào)錯(cuò),這就說(shuō)明在全局是無(wú)法獲取到(閉包除外)函數(shù)內(nèi)部的變量。
一般將作用域分成:全局作用域,函數(shù)作用域,塊級(jí)作用域
全局作用域
任何不在函數(shù)中或是大括號(hào)中聲明的變量,都是在全局作用域下,全局作用域下聲明的變量可以在程序的任意位置訪問(wèn)。
// 全局變量
var greeting = 'Hello World!';
function greet() {
console.log(greeting);
}
// 打印 'Hello World!'
greet();
函數(shù)作用域
函數(shù)作用域也叫局部作用域,如果一個(gè)變量是在函數(shù)內(nèi)部聲明的它就在一個(gè)函數(shù)作用域下面。這些變量只能在函數(shù)內(nèi)部訪問(wèn),不能在函數(shù)以外去訪問(wèn)
function greet() {
var greeting = 'Hello World!';
console.log(greeting);
}
// 打印 'Hello World!'
greet();
// 報(bào)錯(cuò): Uncaught ReferenceError: greeting is not defined
console.log(greeting);
在函數(shù)內(nèi)部聲明的變量或函數(shù),在函數(shù)外部是無(wú)法訪問(wèn)的,在函數(shù)內(nèi)部定義的變量或者方法只是函數(shù)作用域。
塊級(jí)作用域
ES6引入了let和const關(guān)鍵字,和var關(guān)鍵字不同,在大括號(hào)中使用let和const聲明的變量存在于塊級(jí)作用域中。在大括號(hào)之外不能訪問(wèn)這些變量。
{
// 塊級(jí)作用域中的變量
let greeting = 'Hello World!';
var lang = 'English';
console.log(greeting); // Prints 'Hello World!'
}
// 變量 'English'
console.log(lang);
// 報(bào)錯(cuò):Uncaught ReferenceError: greeting is not defined
console.log(greeting);
作用域鏈
在Javascript中使用一個(gè)變量的時(shí)候,首先Javascript引擎會(huì)嘗試在當(dāng)前作用域下去尋找該變量,如果沒(méi)找到,再到它的上層作用域?qū)ふ?,以此類推直到找到該變量或是已?jīng)到了全局作用域,如果在全局作用域里仍然找不到該變量,它就會(huì)在全局范圍內(nèi)隱式聲明該變量(非嚴(yán)格模式下)或是直接報(bào)錯(cuò)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-409311.html
var sex = '男';
function person() {
var name = '張三';
function student() {
var age = 18;
console.log(name); // 張三
console.log(sex); // 男
}
student();
console.log(age); // Uncaught ReferenceError: age is not defined
}
person();
上述代碼的執(zhí)行步驟:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-409311.html
- student函數(shù)內(nèi)部屬于最內(nèi)層作用域,找不到name,向上一層作用域person函數(shù)內(nèi)部找,找到了輸出“張三”。
- student內(nèi)部輸出sex時(shí)找不到,向上一層作用域person函數(shù)找,還找不到繼續(xù)向上一層找,即全局作用域,找到了輸出“男”。
- 在person函數(shù)內(nèi)部輸出age時(shí)找不到,向上一層作用域找,即全局作用域,還是找不到則報(bào)錯(cuò)。
到了這里,關(guān)于【無(wú)標(biāo)題】作用域的理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!