以前理解的作用鏈域
- 函數(shù)在執(zhí)行的過(guò)程中,首先從自身的函數(shù)作用域找變量;
- 如果從自身內(nèi)部找不到變量,就向上一層尋找變量,一直到全局變量為止;
- 例子:
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() //輸出多少 輸出2
1 首先從fn()執(zhí)行的函數(shù)fn3;
2 fn3里面定義了var a=4;然后執(zhí)行了fn2()
3 fn2()打印了a,但是fn2內(nèi)部并沒(méi)有定義a,所以向上一層,在fn1里面尋找到a為2;
經(jīng)過(guò)查找資料得到的理解
gitbook
segmentFault
顏海靜博客
湯姆大叔博客
- 一系列活動(dòng)的執(zhí)行上下文(EC)形成了棧。棧底是全局上下文,棧頂是活動(dòng)的當(dāng)前上下文,壓棧、出棧類似數(shù)組的pop以及push。
壓棧:全局EC-->局部EC1-->局部EC2-->當(dāng)前EC
出棧:全局EC<--局部EC1<--局部EC2<--當(dāng)前EC
當(dāng)js代碼被載入瀏覽器中時(shí),默認(rèn)進(jìn)入的是一個(gè)全局的執(zhí)行上下文。擋在全局上下文中調(diào)用執(zhí)行一個(gè)函數(shù)時(shí),程序流就進(jìn)入被調(diào)用的函數(shù)內(nèi),此時(shí)引擎就會(huì)為函數(shù)創(chuàng)建一個(gè)新的執(zhí)行上下文,并將其壓入到執(zhí)行上下文堆棧的頂部。瀏覽器總是執(zhí)行在當(dāng)前堆棧頂部的執(zhí)行上下文,一旦執(zhí)行完畢,該上下文就會(huì)被從當(dāng)前堆棧彈出,然后,進(jìn)入其下的上下文執(zhí)行代碼。這樣,堆棧中的上下文就會(huì)被一次執(zhí)行并且彈出堆棧,知道回到全局上下文。
var a = 1;
function fn(){
console.log("1 "+a); //undefined
var a = 5;
console.log("2 "+a); // 5
a++;
var a;
fn3();
fn2();
console.log("3 "+a); //6
function fn2(){
console.log("4 "+a); // 6
a = 20;
console.log("8 "+a);
}
console.log("9 "+a);
}
function fn3(){
console.log("5 "+a) //1
a = 200;
console.log("7 "+a) //1
}
fn();
console.log("6 "+a); //1
結(jié)果:

代碼結(jié)果
- 第4處輸出6,然后下面的a=20,將fn2上一層的a賦值為a(并不是全局的)
- 第5處輸出1,然后下面的a=200,將fn3上一層(也就是全局)的a賦值為200