原理:
1、函數(shù)在執(zhí)行時(shí)先從自己內(nèi)部的局部作用域中查找變量
2、如果在函數(shù)內(nèi)部找不到,則在定義此函數(shù)的作用域中查找變量
3、依次往上,直至全局作用域,如果在全局作用域中依然找不到,則報(bào)錯(cuò)
原理看著抽象,讓我們通過幾個(gè)例子來加深下了解:
例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() //輸出多少
調(diào)用過程:調(diào)用fn()=>fn1(),fn1()返回fn3,調(diào)用fn3,fn3中調(diào)用了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() //輸出多少
調(diào)用過程:fn()=>fn1()=>fn3()=>fn2()=>consolo.log(a)=>輸出
分析:fn2中沒有a變量,在fn1作用域中尋找,任沒有,在全局作用域?qū)ふ?,輸?
例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() //輸出多少
調(diào)用過程:fn()=>fn1()=>fn3()=>fn2()=>console.log(a)=>輸出undefined
分析: fn2內(nèi)部沒有a變量,fn3中尋找,var a已經(jīng)定義,但未賦值,所以輸出undefined