JS中的上下文

? 一.執行上下文的概念:

? ? ?執行上下文簡稱上下文。變量或者函數的上下文決定了它們可以訪問哪些數據,以及它們的行為。每一個上下文都具有一個關聯的變量對象,而這個上下文中定義的所有變量和函數都存在于這個對象上。

? ?二.JS中上下文的執行機制:

? ? ? ? 全局上下文是最外層的上下文。根據ECMAScript實現的宿主環境,表示全局上下文的對象可能不一樣。在瀏覽器中,window對象一般就是我們所說的全局上下文,因此所有通過var定義的全局變量都會綁定在window對象上,但是使用let和const定義的變量則不會定義在全局上下文中。執行上下文是JS代碼在執行時的環境抽象,它包括了變量對象,作用域鏈,this指向等信息。

? ? ? ? 每個函數流都有自己的上下文。當代碼執行流進入函數時,函數的上下文被推到一個上下文棧上。在函數執行完畢之后,上下文棧就會彈出該函數的上下文,把控制權交還給之前的執行上下文。JS中程序的執行流就是通過這個上下文棧進行控制的。

? ? ? ? 上下文在其所有代碼都執行完畢后會被銷毀,包括定義在其上面的所有變量和函數,而全局上下文則會在應用程序退出前才會被銷毀,比如關閉網頁或者是退出瀏覽器。

? ? 三.JS中上下文的生命周期:

? ? ? ? 執行上下文的生命周期包括兩個階段:創建階段和執行階段。

? ? ? ? 3.1創建階段:

? ? ? ? ? ? ?首先會根據上下文的類型來創建一個空的變量對象,然后建立作用域鏈,作用域鏈是一個指向父級作用域的鏈表,用于查找變量的值;在全局上下文中,this的指向為全局對象。在函數內部,this的指向取決于函數的調用方式;然后將函數的參數,函數的聲明和變量添加到變量對象中。

? ? ? ? 3.2執行階段:

? ? ? ? ? ? ?在執行階段會按照如下步驟來進行:按照代碼的順序執行,對變量進行賦值等操作;然后通過作用域來查找變量的值,最后在函數上下文中執行函數體內的代碼。

四.上下文的分類:

? ? ?4.1全局上下文:

? ? ? ? ? ?全局上下文是默認的,最外層的上下文。它存在于整個頁面生命周期,負責全局變量的聲明和函數的執行。

? ? ? 4.2函數執行上下文:

? ? ? ? ? ?每當調用一個函數時,都會創建一個新的函數執行上下文。函數執行上下文在函數執行結束后被銷毀。

? ? ? ?4.3Eval執行上下文:

? ? ? ? ? ? eval函數執行的代碼會在一個新的執行上下文中運行,被稱為eval執行上下文。

五.JS上下文中的作用域鏈:

 var color="blue";function changeColor(){if(color==="blue"){color="red";}else{color="blue"}}changeColor();

就這個例子而言,函數changeColor()的作用域鏈包括兩個對象,一個是它自己的變量對象,一個就是全局上下文的變量對象。在這個函數內部之所以能夠訪問變量color,就是因為可以在作用域中找到這個變量。

var color="blue";function changeColor(){let antherColor="red";function swapColor(){let tempColor=antherColor;anthorColor=color;color=tempColor;//可以訪問到color,antherColor和tempColor}//可以訪問到color,antherColor,訪問不到tempColorswapColor();}changeColor()//只能訪問到color;

在面的例子中,設計三個上下文,全局上下文,changeColor()的局部上下文和swapColor()的局部上下文。在全局上下文中只有一個變量color和一個函數changeColor()。changeColor()的局部上下文中包括一個變量antherColor和一個函數swapColor()?.但是在changeColor()中可以訪問到全局上下文中的變量color。swapColor()的局部上下文中有一個變量tempColor,只能在這個上下文中訪問到。在全局上下文和changeColor()的局部上下文中都無法訪問到變量tempColor。但是在swapColor()中則可以訪問另外兩個上下文中的變量,因為它們都輸父上下文。

? ? ? ? 所以,內部上下文可以通過作用域鏈訪問外部上下文中的一切,但是外部上下文無法訪問內部上下文中的任何東西。因為在上下文中的連接是線性的,有序的。每個上下文都可以到上一級山下文中去搜索變量和函數,但是任何上下文都不能去下一級的上下文中去搜索。內部上下文首先從自己的變量對象開始搜索變量和函數,搜索不到就去搜索上一級變量對象。

?

????????

? ? ? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39872.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第一后裔The First Descendant延遲、卡頓、無法聯機?

The First Descendant第一后裔游戲中還設計了多種輔助攻擊手段,它們如同角色手中的魔法,為戰斗增添了無數可能性。這些輔助攻擊手段或能造成范圍傷害,或能減速敵人,甚至能召喚出強大的支援力量。最近有玩家反映,遇到了…

Windows條件競爭提權漏洞復現(CVE-2024-300889)

漏洞原理 當內核將當前令牌對象的 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION 復制到用戶模式時,錯誤位于函數 AuthzBasepCopyoutInternalSecurityAttributes 內部,該模式的結構如下: //0x30 bytes (sizeof) struct _AUTHZBASEP_SECURIT…

科研工具|從圖片中提取曲線數據

最近水哥在做一個項目時需要用到一篇論文中的數據,而這數據是作者的實驗數據,且年代較為久遠,聯系原作者要一份數據也不太現實,因而只能從論文的圖片中提取數據了。 目前市面上有很多小軟件可以實現這方面的功能,比如…

DVT:華為提出動態級聯Vision Transformer,性能杠杠的 | NeurIPS 2021

論文主要處理Vision Transformer中的性能問題,采用推理速度不同的級聯模型進行速度優化,搭配層級間的特征復用和自注意力關系復用來提升準確率。從實驗結果來看,性能提升不錯 來源:曉飛的算法工程筆記 公眾號 論文: Not All Image…

應用進程、SurfaceFlinger進程、HWC進程 之間的關系

應用進程、SurfaceFlinger進程、HWC(Hardware Composer)進程在Android系統中扮演著重要的角色,它們之間的關系和通信流程是Android圖形顯示系統的核心部分。以下是這三者之間關系和通信流程的詳細分析: 一、三者之間的關系 應用進…

AI 寫作:隨著互聯網的普及、人工智能的應用,越來越多的問題能很快得到答案。那么,我們的問題是否會越來越少?以上材料引發了你怎樣的聯想和思考?

隨著互聯網的迅速發展和人工智能技術的進步,信息獲取的速度和廣度都達到了前所未有的程度。人們只需輕點幾下鼠標或對著智能設備說出一句指令,海量的知識和解決方案就在眼前。這種便捷無疑極大地提高了我們的工作效率和生活質量,使我們在面對…

智慧應急管理平臺:數字孿生,讓防汛救災更科學高效

近期全國各地暴雨頻發,城市排水系統面臨著前所未有的挑戰,應急防澇已成為城市管理中不可或缺的一環。在這個信息化、智能化的時代,數字孿生技術以其獨特的優勢,為應急領域帶來了革命性的變革。數字孿生,作為現實世界在…

揭秘:學校教室采用數碼管同步時鐘的原因-訊鵬電子鐘

在學校的教室里,我們常常會看到數碼管同步時鐘的身影。究竟是什么原因讓它成為學校教室的寵兒呢?讓我們一同來探究其中的奧秘。 數碼管同步時鐘具有極高的準確性。對于學校這樣一個對時間管理要求嚴格的場所,準確的時間是保障教學秩序的基石。…

SwinIR: Image Restoration Using Swin Transformer(ICCV 2021)含代碼復現

目錄 一、Introduction 1 Motivation 2 Contribution 二、原理分析 1 Network Architecture 1)Shallow feature extraction 2) deep feature extraction 3) image reconsruction modules 4) loss function 2 Residual Swin Transformer Block 三、實驗結果…

沒有調用memcpy卻報了undefined reference to memcpy錯誤

現象 在第5行出現了,undefined reference to memcpy’ 1 static void printf_x(unsigned int val) 2{ 3 char buffer[32]; 4 const char lut[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; 5 char *p buffer; 6 while (val || p buffer) { 7 *(p) …

基于循環神經網絡的一維信號降噪方法(簡單版本,Python)

代碼非常簡單。 import torch import torch.nn as nn from torch.autograd import Variable from scipy.io.wavfile import write #need install pydub module #pip install pydub import numpy as np import pydub from scipy import signal import IPython import matplot…

C語言學習記錄(十二)——指針與數組及字符串

文章目錄 前言一、指針和數組二、指針和二維數組**行指針(數組指針)** 三、 字符指針和字符串四、指針數組 前言 一個學習嵌入式的小白~ 有問題評論區或私信指出~ 提示:以下是本篇文章正文內容,下面案例可供參考 一、指針和數組 在C語言中 &#xff0…

【vscode插件】多行注釋

最近在編寫C程序的過程中,筆者發現,vscode默認的多行注釋是使用單行注釋拼起來的,對于筆者想要突出多行注釋,同時便于后續修改的需求無法滿足,隨體驗一下自己開發VSCODE插件。 可以說,整個插件的開發和上線…

軟件開發生命周期(Software Development Life Cycle, SDLC)

目錄 簡介 簡介 軟件開發生命周期(Software Development Life Cycle, SDLC)是軟件從概念到正式交付和維護的一系列階段。每個階段都有其特定的目標和活動,以下是軟件開發生命周期中常見的幾個階段: 需求收集與分析(R…

IndexError: image index out of range

IndexError: image index out of range 這個錯誤通常意味著你嘗試訪問的圖像索引超出了圖像的實際尺寸范圍。在你給出的代碼行: s_img_point_color_list.append(s_pixels[coordinate[0], coordinate[1]])你正在嘗試從 s_pixels 這個變量(很可能是一個圖…

Android系統為什么lmkd殺到adj 100就代表有低內存?

在Android系統中,lmkd(Low Memory Killer Daemon,低內存終止守護進程)負責監控系統的內存狀態,并在內存壓力較高時通過終止不必要的進程來釋放內存,以維持系統的穩定運行。關于lmkd為何在殺到adj&#xff0…

Nginx負載均衡及動靜分離

目錄 一、Nginx負載均衡【重點】 1.1 輪詢 1.2 權重 1.3 ip_hash 二、Nginx動靜分離【重點】 2.1 動態資源代理 2.2 靜態資源代理 官方文檔 nginx 一、Nginx負載均衡【重點】 Nginx為我們默認提供了三種負載均衡的策略: 輪詢:將客戶端發起的請求…

【chatgpt】pytorch中requires_grad=True

在 PyTorch 中,requires_gradTrue 是一個非常重要的標志,它指示 PyTorch 是否需要為某個張量計算梯度。這在訓練神經網絡時尤為關鍵,因為我們通常需要通過反向傳播來更新模型參數,以最小化損失函數。 requires_gradTrue 的作用 …

Perl變量作用域全解析:掌握變量的可見之旅

Perl變量作用域全解析:掌握變量的可見之旅 Perl是一種靈活的腳本語言,以其對文本處理的強大能力而聞名。在Perl編程中,變量作用域的概念至關重要,它決定了變量在代碼中的可見性和生命周期。本文將深入探討Perl中變量作用域的定義…

AI降重,不再難:降AI率的實用技巧大揭秘

如何有效降低AIGC論文的重復率,也就是我們說的aigc如何降重?AIGC疑似度過高確實是個比較愁人的問題。如果你用AI幫忙寫了論文,就一定要在交稿之前做一下AIGC降重的檢查。一般來說,如果論文的AIGC超過30%,很可能會被判定…