原理:
1、函数在执行时先从自己内部的局部作用域中查找变量
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