一. 作用域
JavaScript作用域是什么虏等?
作用域指的就是變量存在的范圍
我們的作用域又分成了全局作用域和局部作用域兩塊
現(xiàn)在我們說一說怎么分別認(rèn)知:
局部變量是只能在函數(shù)內(nèi)部操作,而我們的局部作用域也是一樣的招刹。全局作用域在整個程序中一直存在氯材,所有地方都可以讀取。
局部作用域只能在函數(shù)內(nèi)部存在。
在大多數(shù)的語言中都是用花括號{ }來形成一個作用域
{
int a=2
}
但是在我們JavaScript中{ }是不能形成作用域的埃元,需要靠函數(shù)來形成。
1. 我們看一段代碼:
function fn() {
var a= '您好';
console.log(a);
}//輸出 您好 在控制臺
fn()
在函數(shù)執(zhí)行后媚狰,輸出了a變量岛杀,a變量是我們定義在fn函數(shù)里的。
2. 再看一段代碼:
var b='您好';
function fn() {
console.log(b);
}//輸出 您好 在控制臺
fn()
這段代碼并沒有在內(nèi)部定義變量崭孤,它為首先在fn函數(shù)中查找a這個變量类嗤,查找不到就會跳到自己的上層(全局)來查找到變量b糊肠。
二. 作用域鏈
//繼續(xù)看這個代碼
var b='您好';
function fn() {
console.log(b);
}//輸出 您好 在控制臺
fn()
我們控制臺輸出b這個變量,需要首先找到var b遗锣;首先它會在自己的函數(shù)區(qū)域中查找货裹,如果找不到就會去往自己的上層。
//再看一個代碼
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var b= 2
return fn3
}
var fn = fn1()
fn() //輸出1
這段代碼首先fn2 console.log(a) 變量a輸出到控制臺精偿,我們首先在fn2中查找變量a弧圆,沒有?我們往上層查找到fn1中沒有變量a? 那我們再往上到全局屬性后查找到var a = 1 ; 找到后輸出1笔咽。
總結(jié)一下:
- 函數(shù)在執(zhí)行的過程中會先從自己的內(nèi)部查找變量
- 如果找不到再從當(dāng)前創(chuàng)建函數(shù)的所在作用域去找搔预,以此往上
- 如果查找到后就會立即停止
- 如果在全局作用域還沒找到的話,就會報錯:ReferenceError: 某變量 is not defined
以上是我對作用域和作用域鏈的理解拓轻,有不足之處請多見諒