我們都知道js有一個(gè)變量提升的東西,那是因?yàn)樵谶M(jìn)入EC(執(zhí)行上下文)的時(shí)候,首先會(huì)去掃當(dāng)前的作用域中,有沒有函數(shù)申明和變量申明,有的話,會(huì)存入AO(活動(dòng)對(duì)象當(dāng)中)。這個(gè)就是造成變量提升的原因。那么有一個(gè)問題,加入一個(gè)有一個(gè)函數(shù)申明在一個(gè)對(duì)象中呢(不知道這里這么叫法是否合適)?如下代碼所示:function aaa() { return { bbb: function() { return 1;
}
};
}console.log(aaa().bbb());如上所示,這是一個(gè)閉包,因?yàn)閎bb有權(quán)訪問aaa的作用域(雖然這里沒有訪問)。當(dāng)然了,這里的關(guān)鍵不在于閉包。那么問題來了,我想問的是,bbb這個(gè)函數(shù)JS解析器是在什么時(shí)候解析到的呢?不可能是在進(jìn)入執(zhí)行上下文的時(shí)候解析吧?那是在解析return這句代碼的時(shí)候,發(fā)現(xiàn)返回的是一個(gè)對(duì)象,然后這個(gè)對(duì)象中有一個(gè)函數(shù)?所以在創(chuàng)建這個(gè)函數(shù)的時(shí)候,再帶上該函數(shù)的作用域鏈。由于這個(gè)作用域鏈中有aaa的作用域,所以在aaa()執(zhí)行完的時(shí)候,其中的AO并沒有被銷毀,也就是形成了閉包。不知道上面這么理解有沒有誤?疑惑在于bbb中的function是在什么時(shí)候被JS引擎解析的?是在一開始創(chuàng)建執(zhí)行上下文?還是在執(zhí)行到return這句代碼的時(shí)候?
JS 何時(shí)解析function
阿波羅的戰(zhàn)車
2018-08-11 11:10:26