精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript 運行原理解析

開發 前端
說到JavaScript的運行原理,自然繞不開JS引擎,運行上下文,單線程,事件循環,事件驅動,回調函數等概念。

 說到JavaScript的運行原理,自然繞不開JS引擎,運行上下文,單線程,事件循環,事件驅動,回調函數等概念。

[[284890]]

為了更好的理解JavaScript如何工作的,首先要理解以下幾個概念。

  • JS Engine(JS引擎)
  • Runtime(運行上下文)
  • Call Stack (調用棧)
  • Event Loop(事件循環)
  • Callback (回調)

1.JS Engine

簡單來說,JS引擎主要是對JS代碼進行詞法、語法等分析,通過編譯器將代碼編譯成可執行的機器碼讓計算機去執行。

目前最流行的JS引擎非V8莫屬了,Chrome瀏覽器和Node.js采用的引擎就是V8引擎。引擎的結構可以簡單由下圖表示:

 

[[284891]]

 

就如JVM虛擬機一樣,JS引擎中也有堆(Memory Heap)和棧(Call Stack)的概念。

  • 棧。用來存儲方法調用的地方,以及基礎數據類型(如var a = 1)也是存儲在棧里面的,會隨著方法調用結束而自動銷毀掉(入棧-->方法調用后-->出棧)。
  • 堆。JS引擎中給對象分配的內存空間是放在堆中的。如var foo = {name: 'foo'} 那么這個foo所指向的對象是存儲在堆中的。

此外,JS中存在閉包的概念,對于基本類型變量如果存在與閉包當中,那么也將存儲在堆中。詳細可見此處1,3

關于閉包的情況,就涉及到Captured Variables。我們知道Local Variables是最簡單的情形,是直接存儲在棧中的。而Captured Variables是對于存在閉包情況和with,try catch情況的變量。

  1. function foo () { 
  2.  var x; // local variables 
  3.  var y; // captured variable, bar中引用了y 
  4.  function bar () { 
  5.  // bar 中的context會capture變量y 
  6.  use(y); 
  7.  } 
  8.  return bar; 

如上述情況,變量y存在與bar()的閉包中,因此y是captured variable,是存儲在堆中的。

2.RunTime

JS在瀏覽器中可以調用瀏覽器提供的API,如window對象,DOM相關API等。這些接口并不是由V8引擎提供的,是存在與瀏覽器當中的。因此簡單來說,對于這些相關的外部接口,可以在運行時供JS調用,以及JS的事件循環(Event Loop)和事件隊列(Callback Queue),把這些稱為RunTime。有些地方也把JS所用到的core lib核心庫也看作RunTime的一部分。

 

JavaScript 運行原理解析

 

同樣,在Node.js中,可以把Node的各種庫提供的API稱為RunTime。所以可以這么理解,Chrome和Node.js都采用相同的V8引擎,但擁有不同的運行環境(RunTime Environments)[4]。

3.Call Stack

JS被設計為單線程運行的,這是因為JS主要用來實現很多交互相關的操作,如DOM相關操作,如果是多線程會造成復雜的同步問題。因此JS自誕生以來就是單線程的,而且主線程都是用來進行界面相關的渲染操作 (為什么說是主線程,因為HTML5 提供了Web Worker,獨立的一個后臺JS,用來處理一些耗時數據操作。因為不會修改相關DOM及頁面元素,因此不影響頁面性能),如果有阻塞產生會導致瀏覽器卡死。

如果一個遞歸調用沒有終止條件,是一個死循環的話,會導致調用棧內存不夠而溢出,如:

  1. function foo() { 
  2.  foo(); 
  3. foo(); 

例子中foo函數循環調用其本身,且沒有終止條件,瀏覽器控制臺輸出調用棧達到最大調用次數。

 

JavaScript 運行原理解析

 

JS線程如果遇到比較耗時操作,如讀取文件,AJAX請求操作怎么辦?這里JS用到了Callback回調函數來處理。

對于Call Stack中的每個方法調用,都會形成它自己的一個執行上下文Execution Context,關于執行上下文的詳細闡述請看這篇文章

4.Event Loop & Callback

JS通過回調的方式,異步處理耗時的任務。一個簡單的例子:

var result = ajax('...');console.log(result);復制代碼

此時并不會得到result的值,result是undefined。這是因為ajax的調用是異步的,當前線程并不會等到ajax請求到結果后才執行console.log語句。而是調用ajax后請求的操作交給回調函數,自己是立刻返回。正確的寫法應該是:

  1. ajax('...'function(result) { 
  2.  console.log(result); 
  3. }) 

此時才能正確輸出請求返回的結果。

JS引擎其實并不提供異步的支持,異步支持主要依賴于運行環境(瀏覽器或Node.js)。

So, for example, when your JavaScript program makes an Ajax request to fetch some data from the server, you set up the “response” code in a function (the “callback”), and the JS Engine tells the hosting environment: “Hey, I’m going to suspend execution for now, but whenever you finish with that network request, and you have some data, please call this function back.”

The browser is then set up to listen for the response from the network, and when it has something to return to you, it will schedule the callback function to be executed by inserting it into the event loop.

上面這兩段話摘自于How JavaScript works,以通俗的方式解釋了JS如何調用回調函數實現異步處理。

所以什么是Event Loop?

Event Loop只做一件事情,負責監聽Call Stack和Callback Queue。當Call Stack里面的調用棧運行完變成空了,Event Loop就把Callback Queue里面的第一條事件(其實就是回調函數)放到調用棧中并執行它,后續不斷循環執行這個操作。

一個setTimeout的例子以及對應的Event Loop動態圖:

  1. console.log('Hi'); 
  2. setTimeout(function cb1() {  
  3.  console.log('cb1'); 
  4. }, 5000); 
  5. console.log('Bye'); 

 

JavaScript 運行原理解析

 

setTimeout有個要注意的地方,如上述例子延遲5s執行,不是嚴格意義上的5s,正確來說是至少5s以后會執行。因為Web API會設定一個5s的定時器,時間到期后將回調函數加到隊列中,此時該回調函數還不一定會馬上運行,因為隊列中可能還有之前加入的其他回調函數,而且還必須等到Call Stack空了之后才會從隊列中取一個回調執行。

所以常見的setTimeout(callback, 0) 的做法就是為了在常規的調用介紹后馬上運行回調函數。

  1. console.log('Hi'); 
  2. setTimeout(function() { 
  3.  console.log('callback'); 
  4. }, 0); 
  5. console.log('Bye'); 
  6. // 輸出 
  7. // Hi 
  8. // Bye 
  9. // callback 

在說一個容易犯錯的栗子:

  1. for (var i = 0; i < 5; i++) { 
  2.  setTimeout(function() { 
  3.  console.log(i); 
  4.  }, 1000 * i); 
  5.      
  6. // 輸出:5 5 5 5 5 

上面這個栗子并不是輸出0,1,2,3,4,第一反應覺得應該是這樣。但梳理了JS的時間循環后,應該很容易明白。

調用棧先執行 for(var i = 0; i < 5; i++) {...}方法,里面的定時器會到時間后會直接把回調函數放到事件隊列中,等for循環執行完在依次取出放進調用棧。當for循環執行完時,i的值已經變成5,所以最后輸出全都是5。

關于定時器又可以看看這篇有意思的文章

最后關于Event Loop,可以參考下這個視頻。到目前為止說的event loop是前端瀏覽器中的event loop,關于Nodejs的Event Loop的細節闡述,請看我的另一篇文章Node.js design pattern : Reactor (Event Loop)。兩者的區別對比可查看這篇文章你不知道的Event Loop,對兩種event loop做了相關總結和比較。

總結

最后總結一下,JS的運行原理主要有以下幾個方面:

  • JS引擎主要負責把JS代碼轉為機器能執行的機器碼,而JS代碼中調用的一些WEB API則由其運行環境提供,這里指的是瀏覽器。
  • JS是單線程運行,每次都從調用棧出取出代碼進行調用。如果當前代碼非常耗時,則會阻塞當前線程導致瀏覽器卡頓。
  • 回調函數是通過加入到事件隊列中,等待Event Loop拿出并放到調用棧中進行調用。只有Event Loop監聽到調用棧為空時,才會從事件隊列中從隊頭拿出回調函數放進調用棧里。

 

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

2016-10-21 11:04:07

JavaScript異步編程原理解析

2020-08-13 11:24:45

Java技術開發

2023-02-28 09:07:18

ChatGPTAI

2017-05-31 13:16:35

PHP運行機制原理解析

2020-01-13 10:45:35

JavaScript解析前端

2021-07-05 07:51:43

JVM底層Python

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-01-12 14:46:34

Kubernetes開發存儲

2023-08-11 07:44:40

TCP滑動窗口數據

2020-05-21 13:25:43

Spring組件架構

2021-12-01 18:36:35

屬性

2024-06-27 08:26:10

LooperAndroid內存

2015-07-01 13:34:22

Kubernetes應用部署模型

2010-07-06 10:07:10

jQueryJSON

2021-06-16 15:18:03

鴻蒙HarmonyOS應用

2015-08-19 10:36:24

Zigbee技術無線通信

2023-11-16 09:01:37

Hadoop數據庫

2015-08-18 09:40:32

OpenStack Neutron虛擬網絡

2024-10-12 10:29:11

計算機圖形

2024-08-27 12:32:32

點贊
收藏

51CTO技術棧公眾號

欧美女人交a| 国产在线视频资源| 中文字幕亚洲精品乱码| 亚洲国产成人久久综合| 99色这里只有精品| 免费在线国产| 国产精品2024| 日韩免费视频在线观看| 黄色片子在线观看| 婷婷激情久久| 91精品国产日韩91久久久久久| 国产色一区二区三区| 男人av在线| 国产91在线看| 国产日本欧美一区| 日韩精品1区2区| 亚洲最大av| 国产一区二区久久精品| 久久人妻少妇嫩草av无码专区| 国产69精品久久久久9999人| 五月婷婷久久综合| 国产欧美自拍视频| av大片在线播放| 91在线视频官网| 91国产在线播放| 97国产成人无码精品久久久| 国产一区白浆| 欧美黄色免费网站| 国产大片免费看| 人人狠狠综合久久亚洲婷| 亚洲福利在线观看| 乳色吐息在线观看| 国产亚洲欧美日韩精品一区二区三区 | 欧美日韩另类视频| 热久久最新地址| 日韩专区在线| 欧美国产精品劲爆| 日本一区精品| 国产精品福利小视频| 日本少妇bbwbbw精品| www.黄色小说.com| 超碰在线网站| 亚洲人妖av一区二区| 水蜜桃亚洲精品| 九一在线视频| 国产亚洲精品7777| 欧美一区二区三区电影在线观看| 深爱激情五月婷婷| 99精品欧美一区| 国产91精品入口17c| 国产毛片毛片毛片毛片毛片| 激情综合色播激情啊| 成人中文字幕在线观看| 一区二区三区少妇| 99这里只有精品视频| 日韩天堂在线观看| 91超薄肉色丝袜交足高跟凉鞋| 视频一区日韩| 日韩欧美色综合网站| 欧洲成人午夜精品无码区久久| 国产成年精品| 日韩欧美一卡二卡| 95视频在线观看| 欧美巨大xxxx| 亚洲欧美综合另类中字| 精品一区二区三区蜜桃在线| 日韩国产在线| 欧美大片在线影院| 91精品国产乱码在线观看| 久久福利毛片| 国产精品成人av在线| 中文在线资源天堂| 国产一区二区三区香蕉| 97人人澡人人爽| 四虎成人免费在线| 国产亚洲婷婷免费| 特级黄色录像片| 成人爽a毛片免费啪啪动漫| 欧美日韩国产精品| 天堂社区在线视频| 一本色道久久hezyo无码| 国产精品亚洲成在人线| 91精品国产免费| 欧美乱妇40p| 三上悠亚 电影| 精品淫伦v久久水蜜桃| 亚洲毛片在线看| 顶级黑人搡bbw搡bbbb搡| 韩国欧美一区| 国产精品成人aaaaa网站| 国产成人久久精品77777综合| 成人动漫在线一区| 亚洲国产欧洲综合997久久| a篇片在线观看网站| 精品久久久久久久久久久久| 亚洲最大综合网| 91国内精品白嫩初高生| 亚洲网址你懂得| 久久在线视频精品| 免费久久精品视频| 国产日韩精品久久| 日本中文字幕伦在线观看| 亚洲国产一区在线观看| www.色偷偷.com| 国产精品qvod| 久久国产精品视频| 夜夜躁日日躁狠狠久久av| 丁香婷婷深情五月亚洲| 在线观看日韩片| 韩日成人影院| 亚洲第一天堂av| 日韩精品一区二区亚洲av性色| 欧美亚洲一区| 高清视频一区二区三区| 免费黄色网址在线观看| 色婷婷精品大在线视频 | 中文字幕av一区二区三区佐山爱| 欧美大肚乱孕交hd孕妇| 久久久久麻豆v国产| 免费久久99精品国产自在现线| 99精品国产一区二区| av色图一区| 一本大道久久精品懂色aⅴ| 日本人妻一区二区三区| 日韩中字在线| 国产精品91久久久| 青青草视频免费在线观看| 亚洲福利一区二区| 四虎永久免费观看| 欧美jjzz| 91香蕉亚洲精品| a√资源在线| 欧美伊人久久久久久久久影院| 免费观看一级一片| 亚洲一区观看| 精品乱码一区| 少妇视频在线观看| 国产视频精品xxxx| 日韩 欧美 中文| 91色九色蝌蚪| 欧美成人精品欧美一级乱| 日韩三级视频| 欧美在线精品免播放器视频| 凸凹人妻人人澡人人添| 亚洲成av人片一区二区| 黑人玩弄人妻一区二区三区| 欧美三级午夜理伦三级中文幕| 91亚洲va在线va天堂va国| 菠萝蜜视频国产在线播放| 91精品国产综合久久精品麻豆| 日韩高清dvd碟片| 国产精品一区二区免费不卡| 一级性生活视频| 在线精品国产亚洲| 久久久午夜视频| 天天在线女人的天堂视频| 日韩欧美大尺度| 谁有免费的黄色网址| 蜜臀久久久99精品久久久久久| 一区二区免费在线观看| 麻豆国产精品| 久久久久久美女| 天天干视频在线观看| 欧美日韩国产精品一区二区不卡中文 | 少妇高潮av久久久久久| 久久久www免费人成精品| 四季av一区二区| 亚洲第一偷拍| 国产精品久久久久av福利动漫| 老司机深夜福利在线观看| 亚洲区免费影片| 国产精品毛片久久久久久久av| 亚洲另类在线一区| 私密视频在线观看| 免费在线看成人av| 亚洲国产一二三精品无码| 国产精品videossex| 国产精品久久久久久久电影| 国产黄色在线免费观看| 亚洲国产欧美一区二区三区久久| 国产黄网在线观看| 亚洲精品一卡二卡| 中文精品在线观看| 黄页网站大全一区二区| 奇米影视亚洲色图| 日韩精品久久久久久久电影99爱| 91网站免费观看| 芒果视频成人app| 久久久精品美女| 偷拍自拍在线视频| 欧美一区二区三区免费在线看 | 精品伦理一区二区三区| 97精品国产综合久久久动漫日韩| 久久99精品久久久久久噜噜 | 99国产揄拍国产精品| 偷拍亚洲欧洲综合| 91视频最新网址| 99精品黄色片免费大全| 极品粉嫩美女露脸啪啪| 亚洲国产日本| 男插女免费视频| 精品高清在线| 国产综合av一区二区三区| 99精品国产九九国产精品| 欧美在线xxx| 国产美女福利在线观看| 中文字幕亚洲精品| 亚洲色大成网站www| 欧美一区二区视频在线观看2022 | 337p亚洲精品色噜噜噜| 亚洲欧美一区二区三区在线观看| 一区二区三区欧美亚洲| www.黄色com| 国产欧美日韩在线| 国产一级二级在线观看| 国产**成人网毛片九色| 制服丝袜中文字幕第一页| 免费亚洲婷婷| 日韩 欧美 视频| 伊人久久大香线蕉综合四虎小说 | av影片在线| 久久国产精品久久国产精品| av福利在线播放| 国产一区二区三区网站| 四虎精品在线| 日韩av一区二区在线| 韩国av在线免费观看| 日韩欧美成人激情| 国产麻豆91视频| 欧美日韩国产小视频在线观看| 在线观看日本网站| 日韩欧美中文在线| 久久黄色精品视频| 午夜a成v人精品| 国产黄色片免费看| 欧美性猛交xxxx| 男人日女人网站| 狠狠躁夜夜躁人人躁婷婷91 | 免费久久99精品国产| 超碰av在线免费观看| 久久免费国产| 久久久国产欧美| 欧美aaaaaa午夜精品| 538在线视频观看| 蜜桃精品在线观看| 777一区二区| 国产在线不卡一区| 亚洲一区二区偷拍| 国产ts人妖一区二区| 国产伦精品一区二区三区88av| 国产不卡视频一区二区三区| 97精品人妻一区二区三区蜜桃| av激情亚洲男人天堂| yy6080午夜| 久久蜜桃av一区精品变态类天堂| 亚洲精品成人无码| 中文字幕不卡一区| 99久久久免费精品| 亚洲最新视频在线播放| 日本少妇bbwbbw精品| 一本一道综合狠狠老| 日本妇乱大交xxxxx| 欧美精品123区| 亚洲h视频在线观看| 亚洲第一免费网站| 国产系列在线观看| 久久精品99久久久香蕉| 国模私拍视频在线播放| 欧美在线视频免费| 日日夜夜亚洲| 狠狠色噜噜狠狠色综合久| 国产欧美日韩精品高清二区综合区| 日韩视频精品| 亚洲电影影音先锋| 男人操女人逼免费视频| 日韩av电影天堂| 永久看看免费大片| 久久亚洲精精品中文字幕早川悠里 | 国产jk精品白丝av在线观看| 99这里只有精品视频| 精品乱码一区| 日韩综合网站| 日本a在线免费观看| 日韩和的一区二区| 极品人妻一区二区| 国产日韩亚洲欧美综合| 免费在线黄色网| 日韩欧美中文字幕在线观看| 91成年人视频| 亚洲精品午夜精品| 成人ww免费完整版在线观看| 538国产精品一区二区免费视频| 国产亚洲人成a在线v网站| 国产精品毛片va一区二区三区| 国产精品日韩精品中文字幕| 国产制服91一区二区三区制服| 亚洲欧美久久| 9191在线视频| 亚洲国产成人午夜在线一区 | 91成人高清| 97视频在线观看播放| 91麻豆精品国产91久久久更新资源速度超快| 国产一区二区无遮挡| 久久久久美女| 天天爽天天爽夜夜爽| 成人晚上爱看视频| 日日噜噜夜夜狠狠久久波多野| 日韩欧美一区二区三区| 亚洲国产精品国自产拍久久| 中文字幕在线观看亚洲| 亚洲天堂资源| 国产主播一区二区三区四区| 欧美伊人久久| 国产又黄又猛的视频| 久久九九久精品国产免费直播| 亚洲精品在线观看av| 91麻豆精品国产91久久久久| 内衣办公室在线| 38少妇精品导航| 米奇精品关键词| 少妇大叫太大太粗太爽了a片小说| 久久99精品视频| 精品无码在线观看| 色哟哟在线观看一区二区三区| 少妇av一区二区| 欧美国产日本在线| 免费看一区二区三区| 国产成人三级视频| 国产麻豆欧美日韩一区| 波多野结衣久久久久| 欧美性受xxxx黑人xyx性爽| 久热av在线| 日韩免费精品视频| 国产一区二区三区91| 99精品视频播放| 国产亚洲成av人在线观看导航| 五月天激情国产综合婷婷婷| 91丨porny丨户外露出| 国产欧美精品一区二区三区-老狼| 色悠久久久久综合先锋影音下载| 国产成年人在线观看| 狠狠色综合色综合网络| 一区二区三区四区五区| 日韩一区二区三区精品视频| 国产在线激情视频| 91影院未满十八岁禁止入内| 欧美福利在线| 美国黄色一级视频| 午夜精品一区二区三区电影天堂| 天天摸天天干天天操| 热re99久久精品国产66热| 怕怕欧美视频免费大全| 污污视频网站免费观看| 国产精品嫩草99a| 国产伦理一区二区| 高清亚洲成在人网站天堂| 另类图片第一页| 国产一区亚洲二区三区| 国产精品日日摸夜夜摸av| 一区二区日韩在线观看| www.亚洲男人天堂| 亚洲一二三区视频| 少妇无码av无码专区在线观看| 久久人人爽人人爽| 在线观看国产小视频| 欧美成人亚洲成人| 欧美大奶一区二区| 国产极品美女高潮无套久久久| 国产精品久久久久久久久图文区| 99久久国产免费| 91av在线看| 欧美在线电影| 无码人妻一区二区三区一| 欧美色道久久88综合亚洲精品| 国产视频网站在线| 亚洲精品女av网站| 国产午夜久久| 大地资源高清在线视频观看| 精品少妇一区二区三区在线播放 | 精品国产电影一区| 国产69久久| av免费精品一区二区三区| 蜜桃av一区| 玖玖爱这里只有精品| 日韩大片在线观看视频| 色成人综合网| 久久久999免费视频| 中文字幕一区二区三中文字幕| 人妻一区二区三区四区| 国产精品久久久久久久久久久不卡| 亚洲成人tv| 亚洲第一成人网站| 日韩视频在线永久播放| 素人一区二区三区| 99久久国产综合精品五月天喷水| 中文字幕成人在线观看| 天堂av中文在线资源库| 7777精品伊久久久大香线蕉语言| 久久裸体视频| 国产亚洲自拍av|