JavaScript如何執行語句

目錄

語法/詞法分析

預編譯

解釋執行

預編譯什么時候發生

js運行三步曲

預編譯前奏

預編譯步驟

鞏固基礎練習


語法/詞法分析

按語句塊的粒度解析成抽象語法樹 ,分析該js腳本代碼塊的語法是否正確,如果出現不正確,則向外拋出一個語法錯誤(SyntaxError),停止該js代碼塊的執行,然后繼續查找并加載下一個代碼塊;如果語法正確,則進入預編譯階段, 此時不涉及到運行時;

預編譯

預編譯分為全局預編譯和局部預編譯,全局預編譯發生在頁面加載完成時執行,而局部預編譯發生在函數執行的前一刻。 預編譯階段發生變量聲明和函數聲明,沒有初始化行為(賦值),匿名函數不參與預編譯 。只有在解釋執行階段才會進行變量初始化 。

解釋執行

js引擎解析代碼,解析一行執行一行 ;? 將實參帶入形參, 直接運行編譯好的代碼塊 ;

預編譯什么時候發生

預編譯分為全局預編譯和局部預編譯,全局預編譯發生在頁面加載完成時執行,而局部預編譯發生在函數執行的前一刻。

tip:預編譯階段發生變量聲明和函數聲明,沒有初始化行為(賦值),匿名函數不參與預編譯 。只有在解釋執行階段才會進行變量初始化 。

js運行三步曲

  1. 語法分析
  2. 預編譯
  3. 解釋執行

預編譯前奏

imply global暗示全局變量,任何變量,如果變量未經聲明就賦值,這些變量就為全局對象所有。一切聲明的全局變量和未經聲明的變量,全歸window所有。

例如:

var a = 123;
window.a = 123;

下面這個函數里面只有一個連等的操作,賦值操作都是自右向左的,而b是未經聲明的變量,所以它是歸window的,我們可以直接使用window.b去使用它。

function test(){// 這里的b是未經聲明的變量,所以是歸window所有的。var a = b = 110;
}

預編譯步驟

首先JavaScript的執行過程會先掃描一下整體語法語句,如果存在邏輯錯誤或者語法錯誤,那么直接報錯,程序停止執行,沒有錯誤的話,開始從上到下解釋一行執行一行。

局部預編譯的4個步驟:

  1. 創建AO對象(Activation Object)執行期上下文。
  2. 找形參和變量聲明,將變量和形參名作為AO屬性名,值為undefined
  3. 將實參值和形參統一。
  4. 在函數體里面找函數聲明,值賦予函數體。

全局預編譯的3個步驟:

  1. 創建GO對象(Global Object)全局對象。
  2. 找變量聲明,將變量名作為GO屬性名,值為undefined
  3. 查找函數聲明,作為GO屬性,值賦予函數體

由于全局中沒有參數的的概念,所以省去了實參形參相統一這一步。

tip:GO對象是全局預編譯,所以它優先于AO對象所創建和執行

鞏固基礎練習

關于AO對象的例子

// 函數
function fn(a){console.log(a);// 變量聲明+變量賦值(只提升變量聲明,不提升變量賦值)var a = 123;console.log(a);// 函數聲明function a(){};console.log(a);// 函數表達式var b = function(){};console.log(b);// 函數function d(){};
}
//調用函數
fn(1);

1.預編譯第1步:創建AO對象

AO{ }

2.預編譯第2步:找形參和變量聲明,將形參名和變量名作為AO對象的屬性名

AO{a : undefined,b : undefined
}

3.預編譯第3步:將實參值和形參統一

AO{a : 1,b : function(){...}
}

4.預編譯第4步:在函數體里面找函數聲明,值賦予函數體。

AO{a : function a(){...},b : undefined,d : function d(){...}
}

最后輸出結果:

// 函數
function fn(a){console.log(a);	 	//根據AO對象中的數據第一個打印的是:fn()// 變量聲明+變量賦值(只提升變量聲明,不提升變量賦值)var a = 123;		// 執行到這時,由于變量賦值是不提升的,所以函數被123覆蓋了console.log(a);		// 123// 函數聲明function a(){};		// 這里被提升上去了,可以忽略console.log(a);		// 123// 函數表達式var b = function(){};console.log(b);		// 根據AO對象中的數據:fn()// 函數function d(){};
}
//調用函數
fn(1);

函數執行完畢,銷毀AO對象。

關于GO對象的例子

global = 100;
function test(){console.log(global);	var global = 200;console.log(global);var global = 300;
}
test();
var global;

1.全局預編譯第1步:創建GO對象

GO{}

2.全局預編譯第2步:找變量聲明,將變量名作為GO屬性名,值為undefined

GO{global:undefined
}

3.全局預編譯第3步:查找函數聲明,作為GO屬性,值賦予函數體

GO{
global:undefined
}

4.局部預編譯第1步:創建AO對象

AO{}

5.局部預編譯第2步:找形參和變量聲明,將形參名和變量名作為AO對象的屬性名

AO{global: undefined
}

6.局部預編譯第3步:將實參值和形參統一(此函數沒有形參)

AO{global: undefined
}

7.局部預編譯第4步:在函數體里面找函數聲明,值賦予函數體。(此函數內沒有函數聲明)

AO{global: undefined
}

最的結果:

global = 100;
function test(){console.log(global);		// 根據AO對象中的數據:undefinedvar global = 200;		// 執行到這時,200覆蓋了undefinedconsole.log(global);		// 200var global = 300;
}
test();
var global;

tip:關于GO對象和AO對象,它們倆是一個種鏈式關系,就拿上面的這個例子來說吧,如果在函數體的內部沒有定義global變量,這也意味著AO對象中將有這個global這個屬性。那如果沒有會怎么辦?它會去GO對象中尋找,說白了也就是一種就近原則。

?

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

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

相關文章

第4章:決策樹

停止 當前分支樣本均為同一類時,變成該類的葉子節點。當前分支類型不同,但是已經沒有可以用來分裂的屬性時,變成類別樣本更多的那個類別的葉子節點。當前分支為空時,變成父節點類別最多的類的葉子節點。 ID3 C4.5 Cart 過擬合 缺…

文本挖掘 day5:文本挖掘與貝葉斯網絡方法識別化學品安全風險因素

文本挖掘與貝葉斯網絡方法識別化學品安全風險因素 1. Introduction現實意義理論意義提出方法,目標 2. 材料與方法2.1 數據集2.2 數據預處理2.3 關鍵字提取2.3.1 TF-IDF2.3.2 改進的BM25——BM25WBM25BM25W 2.3.3 關鍵詞的產生(相關系數) 2.4 關聯規則分析2.5 貝葉斯…

css冒號對齊

實現后的樣式效果 實現方式 html&#xff1a; <el-col v-if"item.showInSingle ! false" :span"6" style"padding: 4px 0"><label>{{ item.label }}&#xff1a;</label><span v-if"singleData[item.prop] ! 0 &…

iOS字體像素與磅的對應關系

注意&#xff1a;低于iOS10的系統&#xff0c;顯示的字寬和字高比高于iOS10的系統小。 這就是iOS10系統發布時&#xff0c;很多app顯示的內容后面出現…&#xff0c;因而出現很多app為了適配iOS10系統而重新發布新版本。 用PS設計的iOS效果圖中&#xff0c;字體是以像素&#x…

SRM訂單管理:優化供應商關系

一、概述SRM訂單管理的概念&#xff1a; SRM訂單管理是指在供應商關系管理過程中&#xff0c;有效管理和控制訂單的創建、處理和交付。它涉及與供應商之間的溝通、合作和協調&#xff0c;旨在實現訂單的準確性、可靠性和及時性。 二、SRM訂單管理的流程&#xff1a; 1. 訂單創…

關于onload事件

onload事件是在網頁中的所有內容&#xff08;包括圖片、樣式表、腳本等&#xff09;都加載完成后觸發的事件。它常用于在頁面加載完成后執行一些操作&#xff0c;例如初始化頁面元素、綁定事件監聽器等。 可以通過以下方式來使用onload事件&#xff1a; 在HTML標簽中直接添加…

NGINX源碼安裝

文章目錄 NGINX源碼安裝安裝依賴包獲取源碼NGINX官方網站各個目錄的用途 編譯安裝安裝結束后的文件設置為服務 NGINX源碼安裝 安裝依賴包 root執行 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel這些包是用于開發和構建軟件…

遞歸的用法和例子

b站視頻&#xff1a;https://www.bilibili.com/video/BV1iS4y1e7MJ/?spm_id_from333.999.0.0&vd_source1717654b9cbbc6a773c2092070686a95 # 遞歸的定義&#xff1a;其實就是自己調用自己&#xff0c;一般用函數的形式來進行 """ 特點&#xff1a; 1、一定…

item_review-獲得TB商品評論

一、接口參數說明&#xff1a; item_review-獲得TB商品評論&#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_review 名稱類型必須描述keyString是調用key&#xff08;點擊獲取…

輕拍牛頭(約數)

題意&#xff1a;求ai在n個數中&#xff0c;ai可以整除的數有多少個&#xff0c;不包括ai自己。 分析&#xff1a;暴力寫需要n^2的時間復雜度&#xff0c;此時想一下預處理每個數的倍數&#xff0c;約數和倍數是有關系的&#xff0c;把每個數的倍數都加上1. #include<bits…

騰訊云SA3服務器AMD處理器CPU網絡帶寬性能詳解

騰訊云AMD服務器SA3實例CPU采用2.55GHz主頻的AMD EPYCTM Milan處理器&#xff0c;睿頻3.5GHz&#xff0c;搭載最新一代八通道DDR4&#xff0c;內存計算性能穩定&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達1900萬pps&#xff0c;最高內網帶寬可支持100Gbps。騰訊云…

typeScript 之 運算符

工具&#xff1a; PlayGround 算術運算符 運算符描述加-減*乘/除%取模(求余)自增–自減 注意和--&#xff0c;實例&#xff1a; let value 0; console.log(value); //0, 先顯示再增加后為1 console.log(value); //2&#xff0c;先增加后為2再顯示關系運算符 運算符描述 …

list.stream.filter,List<List>轉換為List

1.filter過濾 返回符合查詢條件的集合//過濾所有deviceType為1的List<DeviceWorkTimeEntity> list entities.stream().filter(a -> "1".equals(a.getDeviceType())).toList(); 2.List<List>轉換為List 可以使用流(Stream)的flatMap操作 public cl…

嵌入式Linux驅動開發系列五:Linux系統和HelloWorld

三個問題 了解Hello World程序的執行過程有什么用? 編譯和執行&#xff1a;Hello World程序的執行分為兩個主要步驟&#xff1a;編譯和執行。編譯器將源代碼轉換為可執行文件&#xff0c;然后計算機執行該文件并輸出相應的結果。了解這個過程可以幫助我們理解如何將代碼轉化…

從一到無窮大 #10 討論 Apache IoTDB 大綜述中看到的優劣勢

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言問題定義新技術數據模型schemalessTsfile設計雙MemTable高級可擴展查詢其他 IotD…

兩天入門Linux、搭建Spring環境 第一天

一、Linux簡介 1.什么是Linux 一個操作系統&#xff0c;未來公司里面會用到、接觸的新操作系統。 2.為什么學Linux (1)個人職務需要&#xff0c;肯定會接觸到Linux (2)職業發展&#xff0c;以后的發展肯定需要掌握Linux的許多使用方法 3.學哪些內容 (1)Linux基本介紹 (2)…

EnableAutoConfiguration Attributes should be specified via @SpringBootApplic

在排除數據源加載時&#xff0c;發現這個注解EnableAutoConfiguration(exclude{DataSourceAutoConfiguration.class})會飄紅 這是因為在SpringBootApplication中已經有EnableAutoConfiguration注解了&#xff1b; 所以把它改寫成以下的格式即可

圖像變形之移動最小二乘算法(MLS)

基本原理 基于移動最小二乘的圖像變形是通過一組源控制點和目標控制點來控制變形&#xff0c;對于每一個待求變形后位置的點而言&#xff0c;根據預設的形變類型&#xff08;如仿射變換、相似變換、剛性變換&#xff09;求解一個最小二乘優化目標函數估計一個局部的坐標變換矩陣…

metaRTC7 demo mac/ios編譯指南

概要 metaRTC7.0開始全面支持mac/ios操作系統&#xff0c;新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。發布版自帶了x64版第三方類庫&#xff0c;arm版第三方類庫還需開發者自己編譯。 源碼下載 下載文件metartc7.023.7z https://github.com/metartc/metaRTC/re…

?亞商投資顧問 早餐FM/0815生成式人工智能服務管理

01/亞商投資顧問 早間導讀 商務部等9部門&#xff1a;促進農村大宗商品消費更新換代中央財辦等九部門印發指導意見推動農村流通高質量發展《生成式人工智能服務管理暫行辦法》今起施行 02/亞商投資顧問 新聞早餐 // 熱點聚焦 // 商務部等9部門印發《縣域商業三年行動計劃&…