精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美亚洲综合在线| 视频在线观看一区二区三区| 欧美日韩在线一区二区| 免费国产在线精品一区二区三区| 激情五月婷婷网| 欧美色就是色| 欧美一区二区视频观看视频| 阿v天堂2018| 国产在线观看精品一区| 狠狠色丁香婷婷综合久久片| 韩剧1988免费观看全集| 奇米网一区二区| 加勒比久久高清| 欧美中文一区二区三区| www.国产二区| 91在线播放网站| 99久久精品久久久久久清纯| 国产精品久久久久av免费| 一区二区三区免费高清视频 | 欧美一级二级三级蜜桃| 亚洲熟妇av一区二区三区漫画| 日本a在线播放| 91麻豆文化传媒在线观看| 成人av在线亚洲| 日本天堂在线视频| 一个色综合网| 中文字幕久热精品在线视频 | 亚洲bt欧美bt精品777| 欧美一区二区在线视频| 亚洲乱码国产一区三区| 国产污视频在线播放| 亚洲欧美一区二区久久 | 国产爆初菊在线观看免费视频网站| 国产成人自拍在线| 国产狼人综合免费视频| 丰满少妇xoxoxo视频| 亚洲高清在线| 欧美猛男性生活免费| 国产欧美小视频| 国产欧美日韩精品高清二区综合区| 欧美成人免费网站| 性久久久久久久久久久久久久| 天然素人一区二区视频| 色婷婷亚洲精品| 一本大道熟女人妻中文字幕在线| av在线理伦电影| 一区二区三区在线视频免费| 日本一区二区免费高清视频| 在线观看免费黄色| 国产欧美一区在线| 婷婷精品国产一区二区三区日韩| 青青操视频在线| 久久亚洲捆绑美女| 极品日韩久久| 手机在线精品视频| 91免费看`日韩一区二区| 国产九色91| 天天色棕合合合合合合合| 成人综合婷婷国产精品久久免费| 成人免费直播live| 99热这里只有精品在线| 国产福利一区二区三区视频 | 丰满人妻妇伦又伦精品国产| 国产成人aaa| 国产精品久久一区二区三区| 亚洲精品18在线观看| 福利一区二区在线| 国产麻豆乱码精品一区二区三区 | 久久精品人人做人人综合| 免费国产一区| 97最新国自产拍视频在线完整在线看| 欧美经典一区二区三区| 一区二区在线观看网站| 麻豆影视国产在线观看| 一区二区三区日本| 免费无码不卡视频在线观看| 色尼玛亚洲综合影院| 欧美天堂一区二区三区| 婷婷中文字幕在线观看| www.成人网| 亚洲另类图片色| 又嫩又硬又黄又爽的视频| 羞羞答答成人影院www| 欧美激情日韩图片| 超碰在线观看91| 国产综合色视频| 国产伦精品一区二区三区四区视频| 日韩电影免费| √…a在线天堂一区| 国产91沈先生在线播放| 小视频免费在线观看| 精品视频一区 二区 三区| 色婷婷激情视频| 婷婷综合电影| 久久久av亚洲男天堂| 国产午夜激情视频| 日韩电影在线观看网站| 99影视tv| 国产精品天堂| 午夜精品福利在线| 一区二区免费av| 牛牛影视一区二区三区免费看| 中文字幕国产精品久久| 国产性猛交普通话对白| 美女视频免费一区| 国偷自产av一区二区三区小尤奈| av在线电影免费观看| 亚洲一区二区在线播放相泽| 男人搞女人网站| 国产福利资源一区| 久久精品国产69国产精品亚洲| 久久夜靖品2区| 狠狠色狠狠色综合| 色综合久久久久久久久五月| segui88久久综合| 欧美卡1卡2卡| 欧美多人猛交狂配| 亚洲激精日韩激精欧美精品| 国产日韩欧美中文在线播放| 青青草在线免费观看| 亚洲高清免费视频| 欧美一级特黄aaa| 欧美日韩性在线观看| 97视频在线观看免费| www香蕉视频| 1024成人网| 福利片一区二区三区| 国产一区二区三区四区| 91成人天堂久久成人| 亚洲AV无码国产精品午夜字幕| 国产精品网曝门| 日韩视频在线免费看| 狼人精品一区二区三区在线 | 亚洲国产成人久久综合| 日本高清一二三区| 激情五月播播久久久精品| 色姑娘综合av| 亚洲成人短视频| 精品在线欧美视频| 日韩久久中文字幕| 91亚洲精品一区二区乱码| 日韩精品视频在线观看视频| 日韩激情欧美| 欧美大荫蒂xxx| 精品国产无码AV| 怡红院av一区二区三区| 一卡二卡三卡四卡五卡| 亚洲精品国产首次亮相| 91久久精品视频| 国产有码在线| 欧美三日本三级三级在线播放| a级大片在线观看| 鲁大师成人一区二区三区| 久久久久天天天天| 午夜成年人在线免费视频| 欧美成人乱码一区二区三区| 免费一级片在线观看| 国产成人精品网址| 美女扒开大腿让男人桶| 亚洲国产网址| 国产精品91一区| 91社区在线| 91麻豆精品91久久久久同性| 欧美久久久久久久久久久久| 成人动漫在线一区| 日本黄色三级大片| 日韩久久精品| 2022国产精品| 三妻四妾的电影电视剧在线观看 | 国产精品大全| 色多多在线观看| 国产亚洲精品久久久优势| 中文字幕在线观看视频一区| 国产精品成人免费| 久久久久亚洲av成人网人人软件| 亚洲伦伦在线| 视频一区二区在线观看| 国产精品视频一区视频二区| 久久久久久久影院| 国产尤物视频在线| 日韩午夜激情视频| 九九精品免费视频| 综合电影一区二区三区| 免费无码一区二区三区| 日韩高清一级片| 伊人再见免费在线观看高清版| 亚洲一区电影| 国产精品久久久久久亚洲调教| 免费网站看v片在线a| 亚洲成人av在线播放| 日本中文字幕在线观看视频| 亚洲色图.com| 亚洲综合自拍网| 久久成人羞羞网站| 国产精品裸体瑜伽视频| 91免费精品| 久久精品国产理论片免费| 日本国产一区| 欧美亚洲第一区| 国产成人高清精品| 亚洲午夜未删减在线观看 | 国产丝袜一区二区三区免费视频| 国产一区二区波多野结衣| 精品国产91久久久久久老师| 国产免费美女视频| 2024国产精品| 丰满人妻一区二区三区大胸| 免费在线观看成人av| 2022中文字幕| 99精品视频精品精品视频| 久久久久高清| 亚洲一区二区三区中文字幕在线观看| 国产激情视频一区| www在线观看黄色| 萌白酱国产一区二区| 高清美女视频一区| 日韩精品极品视频免费观看| 精品久久久中文字幕人妻| 在线视频你懂得一区| 久草手机在线观看| 一区二区三区在线免费播放| 三级黄色片在线观看| 91麻豆国产福利在线观看| 动漫av在线免费观看| 久久97超碰色| 久久久精品麻豆| 免费在线播放第一区高清av| 日本一区午夜艳熟免费| 永久亚洲成a人片777777| 午夜精品电影在线观看| 一区三区在线欧| 国产精品9999久久久久仙踪林| 99久久这里有精品| 国产九九精品视频| 青青在线精品| 国产精品中文在线| 日韩av超清在线观看| 日韩av电影在线免费播放| 久草在线资源福利站| 国模gogo一区二区大胆私拍 | 国产999精品| 一区二区三区短视频| 91成品人片a无限观看| 国产精品高颜值在线观看| 欧美激情日韩图片| 草草在线观看| 欧美在线视频a| 精品91久久| 国产精品999| 99久久综合国产精品二区| 国产精品高潮视频| 日韩经典一区| 国产在线精品播放| 精品一区二区三区视频在线播放 | 欧美激情国产精品| 草草影院在线| 人妖精品videosex性欧美| 校园春色亚洲色图| 国产精品一区二区三区成人| 色综合一区二区日本韩国亚洲| 国产精品久久久久久久app| 国产国产一区| 51午夜精品| 999久久久精品一区二区| 精品欧美一区二区三区久久久| 亚洲成人黄色| 久久久一本精品99久久精品| 国产成人黄色| 熟女视频一区二区三区| 亚洲午夜一级| 日本中文字幕片| 久国产精品韩国三级视频| 亚洲妇女无套内射精| a亚洲天堂av| 成人小视频免费看| 一二三四社区欧美黄| 毛片基地在线观看| 欧美精品丝袜中出| 免费成人在线看| 亚洲人成网站777色婷婷| 老司机在线永久免费观看| 精品中文字幕在线观看| 亚洲欧美一区二区三区| 国产女人18毛片水18精品| 97久久综合区小说区图片区| 欧美精品一区二区三区在线看午夜 | 青青草成人激情在线| 国产精品毛片久久| 国产深夜男女无套内射| 久久精品国产999大香线蕉| 免费在线观看日韩av| 国产亚洲欧美一区在线观看| 久热这里有精品| 色综合天天综合网天天狠天天| 国产精品亚洲欧美在线播放| 日韩精品视频在线| av片在线观看永久免费| 国产va免费精品高清在线观看| www999久久| 日韩精品福利视频| 激情婷婷欧美| 欧洲美女亚洲激情| 久久久精品免费免费| 久久视频免费看| 欧美日韩亚洲高清一区二区| 无码国产色欲xxxx视频| 免费不卡欧美自拍视频| yw.尤物在线精品视频| 国产一区二区三区四区五区在线| 欧美va久久久噜噜噜久久| 黑人糟蹋人妻hd中文字幕| 国产一区二区按摩在线观看| 国产肥白大熟妇bbbb视频| 一区二区在线免费观看| 中文字幕免费高清在线观看| 日韩av在线免费播放| 午夜激情在线| 92福利视频午夜1000合集在线观看| 男男gay无套免费视频欧美| 国产va亚洲va在线va| 国产一区二区91| jizz亚洲少妇| 欧美日韩国产一二三| 99精品老司机免费视频| 日本久久久a级免费| 久久夜色电影| 精品丰满人妻无套内射| 国产1区2区3区精品美女| 最新黄色av网址| 欧美日韩一区精品| а√天堂中文在线资源bt在线| 欧美一区深夜视频| 青青草原在线亚洲| 青青艹视频在线| www..com久久爱| 日韩男人的天堂| 亚洲第一福利网站| 极品av在线| 鲁丝片一区二区三区| 一本色道久久综合亚洲精品高清| 日本精品一二三区| 亚洲午夜精品在线| 黑人精品一区二区| 国内精品视频一区| 国内毛片久久| 中文字幕无码精品亚洲35| 99久久婷婷国产| 69国产精品视频免费观看| 亚洲欧美国产va在线影院| 免费观看亚洲| 欧美一区免费视频| 蜜桃在线一区二区三区| 岛国片在线免费观看| 欧美一区二区三区性视频| 黄色av网站在线播放| 97se国产在线视频| 伊人蜜桃色噜噜激情综合| 97香蕉碰碰人妻国产欧美 | 国产精品日韩成人| 一级α片免费看刺激高潮视频| 久久天天躁日日躁| 亚洲精品一区二区三区中文字幕| 免费极品av一视觉盛宴| 成人av资源站| 国产一级免费视频| 尤物yw午夜国产精品视频| **国产精品| 精品无码国产一区二区三区av| 97精品电影院| 国产精品成人无码| 久久视频精品在线| 成人自拍在线| 欧美牲交a欧美牲交aⅴ免费下载| 国产日本欧洲亚洲| 99国产精品欲| 97在线视频精品| 青青一区二区三区| 午夜视频在线免费看| 狠狠色狠狠色综合日日小说| 在线观看完整版免费| 春色成人在线视频| 丝袜亚洲另类欧美| 一级片一级片一级片| 亚洲精品wwww| **精品中文字幕一区二区三区| 欧美大黑帍在线播放| 国产喂奶挤奶一区二区三区| 91国偷自产中文字幕久久| 国内精品久久久久久| 日韩精品影视| av网页在线观看| 欧美日韩国产高清一区| 9765激情中文在线| 亚洲日本精品一区| aaa亚洲精品| 99精品久久久久久中文字幕 | 久久久久久无码精品大片| 久久国产精品亚洲| 精品久久久久中文字幕小说| 国产在线观看免费播放|