原理:
1、函數在執(zhí)行時先從自己內部的局部作用域中查找變量
2、如果在函數內部找不到,則在定義此函數的作用域中查找變量
3、依次往上,直至全局作用域,如果在全局作用域中依然找不到,則報錯
是曰:作用域鏈
原理看著抽象,讓我們通過幾個例子來加深下了解:
例1:
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() //輸出多少
調用過程:調用fn()=>fn1(),fn1()返回fn3,調用fn3,fn3中調用了fn2,輸出2。
分析:fn2中沒有a變量,fn2被定義在fn1中,獲得fn1中的變量a=2
例2:
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //輸出多少
調用過程:fn()=>fn1()=>fn3()=>fn2()=>consolo.log(a)=>輸出
分析:fn2中沒有a變量,在fn1作用域中尋找,任沒有,在全局作用域尋找,輸出1
例3:var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
var a
fn2()
a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn() //輸出多少
調用過程:fn()=>fn1()=>fn3()=>fn2()=>console.log(a)=>輸出undefined
分析: fn2內部沒有a變量,fn3中尋找,var a已經定義,但未賦值,所以輸出undefined
總結:作用域鏈不難,先找局部變量,再往定義該函數的作用域尋找變量,直到全局作用域即可。