作用域链
2020 M12 28
函数执行时会形成一个私有作用域,也叫函数作用域。
私有作用域内的形参或声明的变量称为私有变量,其变化与全局变量无关。
如果当前作用域不存在该变量,说明是非私有变量,去上层作用域查找。
如果上层作用域找不到该变量,查找上上层作用域,一直到顶层,还找不到就报错。
这个查找过程类似一条链条,称为作用域链。
定义当前函数的作用域就是该函数的上级作用域,与函数何处执行无关。
var a=10;
function fn1(){
return function fn2(){
return function fn3(){
//这里的a会一直查找到挂载到window上的全局变量a
//fn3=>fn2=>fn1=>window
return a
}
}
}
fn1()()()
var count=10;
function fn(){
var count=100;
return function(){
console.log(count)
}
}
var f=fn();
f();//定义f的作用域实际是fn函数,其上级作用域就是fn,此时count=100
function fn(){
var i=10;
return function (n){
console.log(n+(++i))
}
}
var f=fn();
f(10)//21 私有作用域,计算后i值累加, i=11
f(20) //32 私有作用域 ,此时i=11
fn()(10) //21 独立私有作用域,执行完当前作用域销毁
fn()(20) // 31 独立私有作用域,执行完当前作用域销毁