在ES5中,js的作用域不同于別的語言匹中,{}不構(gòu)成塊級作用域夏漱,作用域是靠函數(shù)形成的。也就是說只有全局作用域和函數(shù)作用域顶捷,并沒有塊作用域挂绰。
例如:
for(var i = 0; i < 3; i++){
var j = 4
}
console.log(i) //3
console.log(j) //4
再來看作用域鏈,我的理解服赎,怎么找一個變量是在哪里聲明的就是靠的作用域鏈原理葵蒂。
記住以下三點基本就可以搞定啦。
- 函數(shù)在執(zhí)行的過程中专肪,先從自己內(nèi)部找變量
- 如果找不到刹勃,再從創(chuàng)建當前函數(shù)所在的作用域去找, 以此往上
- 注意找的是變量的當前的狀態(tài)
舉個例子:
var a = 1
var b = 2
function sum(a) {
var b = 3
console.log(a + b)
}
sum(2) //5
上面的例子顯而易見,那如果函數(shù)里面找不到變量呢嚎尤?那么它會在當前函數(shù)的詞法作用域中去找荔仁,及函數(shù)聲明的作用域中。
// sum函數(shù)中沒有變量b的聲明芽死,所以取全局的
var a = 1
var b = 2
function sum(a) {
console.log(a + b)
}
sum(2) //4
再來看看下面這個例子
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn()
最后會輸出console.log(a)乏梁,那么a取值會是fn3中調(diào)用fn2的地方找嗎,還是fn2聲明的作用域中找呢关贵。上文已經(jīng)有解釋遇骑,那么結(jié)果就是2。