成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript基礎——你真的了解JavaScript嗎?

開發 前端
做為前端開發,你是否問過自己或者思考過什么是JavaScript嗎?JavaScript有什么特點?小編認為,在你想深入一門語言,必須要清楚理解這門語言有什么特點和其中背后的運行機制,這是學好一門語言的基礎。

 什么是JavaScript?

做為前端開發,你是否問過自己或者思考過什么是JavaScript嗎?JavaScript有什么特點?小編認為,在你想深入一門語言,必須要清楚理解這門語言有什么特點和其中背后的運行機制,這是學好一門語言的基礎。

[[281416]]

JavaScript是一個單線程、非阻塞、異步、解釋性語言。

單線程是個什么鬼?

首先我們來一起了解下計算機基礎知識:線程和進程。

打個比方,我們去超市購物,結賬的時候會有多個收銀窗口,這樣的好處就是在同一時間完成更多交易處理。這就是計算機理論常說的多并發,操作系統是多并發執行任務的,因為它同時運行多個進程。進程是執行環境或正在運行的應用程序的實例。例如,你可能一邊瀏覽著網頁、一邊打開編輯器寫著代碼、一邊開著微信聊著天,這都要歸功于計算機能同時運行多個應用進程。

應用程序也是可以處理多并發的,主要是靠線程實現的。像高級語言JAVA就能很輕松的編寫多線程應用處理程序。

但是JavaScript是單線程的運行環境,它有且只有一個調用棧,它每次只能做一件事,程序每次只能運行一段代碼,這就是單線程。

單線程更通俗的解釋就是——所有任務需要排隊,前一個任務結束,才會執行后一個任務。如果前一個任務耗時很長,后一個任務就不得不一直等著。

什么是調用棧?(call stack)——代碼在運行過程中,會有一個叫做調用棧(call stack)的概念。調用棧是一種棧結構,它用來存儲計算機程序執行時候其活躍子程序的信息。(比如什么函數正在執行,什么函數正在被這個函數調用等等信息)。調用棧是解析器的一種機制。

阻塞又是個什么東東?

什么是阻塞,沒有嚴格的定義什么是阻塞。僅僅是指代碼運行得很慢,比如說console.log不慢,遍歷從1到10億次很慢。換句話說在棧里表現很慢的東西都叫阻塞。

就像下圖的代碼,小編寫了一個自己調用自己的函數,讓函數進入無線循環的過程,造成了調用棧里需要執行大量的函數,模擬了一個阻塞,瀏覽器實在無法承受調用之痛,報錯了!

 

JavaScript基礎——你真的了解JavaScript嗎?

 

秘密武器—非阻塞、異步回調

由于JavaScript要解決這個問題,必須要突破單線程的瓶頸,“異步回調”就成為JavaScript的秘密武器,完美的解決了此問題。

異步回調讓其擁有了“多線程”的能力,其實并不其然,異步回調是怎么解決并發問題,阻塞問題,不知道大家思考過背后的運行機制嗎?

維基百科是這么解釋回調函數的:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。

通俗點回調是一個函數被作為一個參數傳遞到另一個函數里,在那個函數執行完后再執行。有點不好理解,小編在說的直白些就是——B函數被作為參數傳遞到A函數里,在A函數執行完后再執行B。

了解完異步回調的概念后,我們來看看JavaScript是如何運行的?首先我們一起來看看下面的圖:

 

JavaScript基礎——你真的了解JavaScript嗎?

 

在介紹這張圖前,我們先了解下什么是任務隊列——所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。

同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務可以執行了,該任務才會進入主線程執行。

主線程從"任務隊列"中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為Event Loop(事件循環)。上圖中,主線程運行的時候,產生堆(heap)和棧(stack),棧中的代碼調用各種外部API,它們在"任務隊列"中加入各種事件(click,load,done)。只要棧中的代碼執行完畢,主線程就會去讀取"任務隊列",依次執行那些事件所對應的回調函數。

"任務隊列"是一個先進先出的數據結構,排在前面的事件,優先被主線程讀取。主線程的讀取過程基本上是自動的,只要執行棧一清空,"任務隊列"上第一位的事件就自動進入主線程。但是,由于存在后文提到的"定時器"功能,主線程首先要檢查一下執行時間,某些事件只有到了規定的時間,才能返回主線程。

文字介紹是不是特枯燥,讓我們看看下組的圖,將JavaScript的運行機制可視化,是否更容易理解呢?

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

 

JavaScript基礎——你真的了解JavaScript嗎?

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2012-02-06 13:52:33

JavaScript

2025-05-22 08:00:00

varletJavaScript

2022-07-26 00:00:22

HTAP系統數據庫

2014-04-17 16:42:03

DevOps

2023-08-03 11:10:05

2017-10-26 08:53:38

前端JavaScript函數式編程

2021-01-15 07:44:21

SQL注入攻擊黑客

2021-11-09 09:48:13

Logging python模塊

2014-11-28 10:31:07

Hybrid APP

2023-03-16 10:49:55

2020-02-27 10:49:26

HTTPS網絡協議TCP

2019-09-16 08:40:42

2021-01-22 07:48:07

JavaScript 高階函數閉包

2022-04-07 16:03:36

JavaScriptTypeScript

2012-05-31 09:56:54

云安全

2023-10-24 08:53:24

FutureTas并發編程

2022-03-14 07:53:27

ELTETL大數據

2022-12-12 08:46:11

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久亚洲 | 日韩亚洲一区二区 | 男女羞羞视频免费看 | 日韩成人免费视频 | 欧美不卡在线 | 国产美女精品视频 | 中文字幕免费观看 | 国产精品视频播放 | 国产欧美一区二区三区在线播放 | 五月天天丁香婷婷在线中 | 性网站免费 | 亚洲国产精品一区二区三区 | 嫩草影院黄 | 美女艹b | 天天躁日日躁狠狠躁2018小说 | 操射视频 | www.久久影视 | 在线观看成人 | 久久久免费在线观看 | 精品欧美乱码久久久久久1区2区 | 视频一区二区中文字幕 | 国产精品视频一区二区三区不卡 | a黄视频| 国产免费视频 | 羞羞视频网 | 日韩在线视频免费观看 | 一区二区三区亚洲 | 亚洲精彩免费视频 | 成人精品一区二区三区中文字幕 | 亚洲一区久久 | 一区二区在线不卡 | 日韩三级一区 | 黄色毛片免费看 | 亚洲精品久久久9婷婷中文字幕 | 中文字幕在线人 | 黄色毛片视频 | 99国内精品久久久久久久 | 中文字幕一区二区三区日韩精品 | 日韩免费一区 | 二区中文| 亚洲欧美综合精品久久成人 |