摘要:重點每一個函數都有自己的執行環境,每個執行環境都有一個與之關聯的變量對象,環境中定義的變量和函數都保存在這個對象中。即當在函數中查找一個變量時,是根據作用域查找的。此掃描的結果將稱為中的。借鑒文章譯的執行上下文和環境棧是什么
重點:每一個函數都有自己的執行環境,每個執行環境都有一個與之關聯的變量對象,環境中定義的變量和函數都保存在這個對象中。
這個對象就是執行上下文對象:
executionContextObj={ //變量對象 variableObject:{/*函數中的arguments對象,參數、內部的變量以及函數聲明*/] //作用域 scopeChain:{/*variableObject以及所有父執行上下文中的variableObject*/}, this:{} }
根據這個執行環境我們解析以下幾個問題:
1、查找變量的順序(知識點:作用域與作用域鏈)
executionContextObj中的scopeChain是這個函數的作用域,scopeChain=variableObject+[[scope]]
varibaleObject為當前的變量對象,[[scope]]為父執行上下文的作用域鏈,variableObject位于前面,所以查找變量時總是先從自身查找,然后依次到父執行上下文中查找。
即當在函數中查找一個變量時,是根據作用域查找的。
2、this是什么?和作用域的區別
this總是指向函數調用時的環境(動態作用域即運行時上下文)
作用域保存的是函數被定義時的環境(靜態作用域即編程時的上下文)
我們知道javascript沒有塊級作用域,最小單位為函數,作用域能訪問到函數中的變量,this則指向調用者,即可訪問對象中的變量
3、提升,函數提升總是優先于變量提升(為什么可以先使用后定義)
參考:[【譯】JS的執行上下文和環境棧是什么?]
在調用函數時,但是在執行里面的代碼之前,會對函數進行一次掃描,解釋器通過掃描傳入的參數或參數的函數、本地函數聲明和局部函數聲明來創建executionContextObj。此掃描的結果將稱為executionContextObj中的variableObject。
就是因為在代碼運行之前,解釋器已經掃描過在函數中變量和函數,已經創建這些變量,所以在代碼執行時,這些變量就可以直接使用,并且函數的提升優先于變量。
借鑒文章:【譯】JS的執行上下文和環境棧是什么?https://juejin.im/post/5c8554...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109117.html
摘要:至此作用域鏈創建完畢。好了,通過深入理解作用域鏈,我們能跟好的理解的運行機制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對我們理解js這們語言。這次想深入的聊下關于js執行的內部機制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當一個函數執行時,js引擎做了哪些事情--那些我們看不見的動作。 關鍵詞: 執行環境 作用域 作用域鏈 變...
摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關的面試題,對核心知識點中的作用域閉包上下文進行了梳理。如果在小區這個作用域找到了張老師,我就會在張老師的輔導下學鋼琴我張老師房間鋼琴構成了學琴的上下文環境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大...
摘要:延長作用域鏈下面兩種語句可以在作用域鏈的前端臨時增加一個變量對象以延長作用域鏈, 問題 今天看筆記發現自己之前記了一個關于同名標識符優先級的內容,具體是下面這樣的: 形參優先級高于當前函數名,低于內部函數名 形參優先級高于arguments 形參優先級高于只聲明卻未賦值的局部變量,但是低于聲明且賦值的局部變量 函數和變量都會聲明提升,函數名和變量名同名時,函數名的優先級要高。執行代...
摘要:圖片中的作用域鏈,是全局執行環境中的作用域鏈。然后此活動對象被推入作用域鏈的最前端。在最后調用的時候,創建先構建作用域鏈,再創建執行環境,再創建執行環境的時候發現了一個變量標識符。 從圖書館翻過各種JS的書之后,對作用域/執行環境/閉包這些概念有了一個比較清晰的認識。 栗子說明一切 第一個栗子 來看一個來自ECMA-262的栗子: var x = 10; (function foo(...
閱讀 2984·2021-10-19 11:46
閱讀 979·2021-08-03 14:03
閱讀 2934·2021-06-11 18:08
閱讀 2905·2019-08-29 13:52
閱讀 2744·2019-08-29 12:49
閱讀 480·2019-08-26 13:56
閱讀 924·2019-08-26 13:41
閱讀 849·2019-08-26 13:35