JavaScript 函數(shù)的執(zhí)行過程
1. 每一個JavaScript函數(shù)都是Function對象的一個實例, 它有一個僅供JavaScript引擎存取的內(nèi)部屬性[[Scope]]. 這個[[Scope]]存儲著一個作用域的集合, 這個集合就叫”作用域鏈”, 集合中存儲著”可變對象”VO或”活動對象”AO(AO比VO多this和arguments屬性).
2. 當(dāng)函數(shù)被創(chuàng)建后, 其父級作用域的作用域鏈中的所有可變對象會被加入到它的[[scope]]中(如果父作用域是全局, 那么當(dāng)前函數(shù)的作用域鏈中就只會加入一個全局對象).
3. 當(dāng)函數(shù)被執(zhí)行時, 函數(shù)的執(zhí)行環(huán)境會被推入一個環(huán)境棧中:
1.此時進入函數(shù)的變量初始化階段, 此階段會確定函數(shù)內(nèi)部: this值, 函數(shù)的參數(shù), 函數(shù)的聲明, 變量的聲明, 以及arguments. 根據(jù)這些值組成當(dāng)前函數(shù)的活動對象AO, 之后會將AO對象保存到當(dāng)前函數(shù)作用域鏈的首位.
注意: AO按如下順序填充:
1.函數(shù)參數(shù)(若有傳參, 會被賦值, 若未傳參, 初始化值為undefined) 優(yōu)先級第二
2.函數(shù)聲明(若發(fā)生命名沖突, 會覆蓋) 優(yōu)先級最高
3.變量聲明(初始化變量值為undefined, 若發(fā)生命名沖突, 會忽略) 優(yōu)先級第三
2.然后就到了函數(shù)的執(zhí)行階段, 此階段當(dāng)前函數(shù)中使用到的所有變量和函數(shù)聲明都會從當(dāng)前函數(shù)的[[Scope]]作用域鏈中查找, 根據(jù)作用域鏈中對象的位置首先會查找當(dāng)前函數(shù)的AO對象, 如果沒有再查找上層對象, 最后找到全局對象, 如果都沒有則會報錯(變量未定義).
以上這篇JavaScript 函數(shù)的執(zhí)行過程就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript Array.flat()函數(shù)用法解析
這篇文章主要介紹了JavaScript Array.flat()函數(shù)用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09javascript 跨瀏覽器開發(fā)經(jīng)驗總結(jié)(五) js 事件
javascript 跨瀏覽器開發(fā)之js 事件的兼容性問題,需要的朋友可以參考下。2010-05-05console.log()與console.dir()的區(qū)別及說明
這篇文章主要介紹了console.log()與console.dir()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Javascript獲取數(shù)組中的最大值和最小值的方法匯總
比較數(shù)組中數(shù)值的大小是比較常見的操作,下面同本文給大家分享四種放哪廣發(fā)獲取數(shù)組中最大值和最小值,對此感興趣的朋友一起學(xué)習(xí)吧2016-01-0120170918 前端開發(fā)周報之JS前端開發(fā)必看
本文給大家分享了最新版js 前端開發(fā)周報,內(nèi)容非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09js改變img標簽的src屬性在IE下沒反應(yīng)的解決方法
在Chrome FF里都能改變成功,但在IE下卻不行,網(wǎng)上搜了半天,大概了解了,這個是IE的一個bug,具體的解決方法如下,有類似問題的朋友可以參考下哈,希望對大家有所幫助2013-07-07