js

瀏覽器解析的構(gòu)成

  • 調(diào)用棧- v8引擎的地盤
  • webAPL- 所以耗時的API都在這里
  • 回調(diào)隊(duì)列- 異步完成后進(jìn)入回調(diào)隊(duì)列,等待調(diào)用
  • 事件循環(huán)- 負(fù)責(zé)指揮回調(diào)隊(duì)列中的任務(wù)。

js是

單線程辽话,非阻塞,異步礼仗,并發(fā)的語言甩苛。

js特點(diǎn):

  • 單線程:一個時間點(diǎn)只能執(zhí)行一條指令
  • 非阻塞:讓耗時的指令出棧,由瀏覽器處理
  • 異步機(jī)制

什么叫調(diào)用棧

調(diào)用棧是JavaScript維護(hù)出來的一種棧結(jié)構(gòu)赏参,作用就是用來分類管理代碼的執(zhí)行上下文的志笼。 存儲順序是按照代碼中函數(shù)的調(diào)用順序。 通常把這種用來管理執(zhí)行上下文的棧稱為執(zhí)行上下文棧把篓,又稱調(diào)用棧纫溃。

什么時候代碼運(yùn)行會變慢

  • 操作document
  • 發(fā)起http請求的時候
  • 定時器

阻塞其實(shí)就是在棧中運(yùn)行很慢的那些東西。

同步是棧韧掩,異步是隊(duì)列

js在同一時間只能做一件事紊浩。
同步就是在瀏覽器執(zhí)行js代碼的時候,將所有同步的代碼放到一個執(zhí)行棧中當(dāng)中疗锐,遇到異步代碼就把異步代碼放到任務(wù)隊(duì)列中坊谁,這樣就形成了異步操作,同步與異步的差別就在于這條流水線上各個流程的執(zhí)行順序不同滑臊。

同步JS 異步JS
指令按照程序中給定順序執(zhí)行 指令可以并行執(zhí)行
下一個指令都必須等待上一個指令完成再執(zhí)行 下一個指令可以在上一個指令執(zhí)行的同時執(zhí)行

大多時候口芍,js都作為同步執(zhí)行 在執(zhí)行某些特定的耗時指令時才發(fā)生異步
執(zhí)行棧:學(xué)過數(shù)據(jù)結(jié)構(gòu)的應(yīng)該都知道,棧的順序是filo(first in last on)简珠,就是說棧里的代碼是先進(jìn)后出的

任務(wù)隊(duì)列:這里用到的就是隊(duì)列阶界,隊(duì)列的順序是fifo(first in first on),隊(duì)列里的代碼是先進(jìn)先出

js的異步操作有哪些

  1. setTimeout聋庵、setInterval
  2. Ajax請求一般采用異步膘融,當(dāng)然也可以設(shè)置為同步
  3. promise.then
  4. 回調(diào)函數(shù)可以理解為異步,但不是嚴(yán)格的異步操作祭玉。

5.事件監(jiān)聽氧映。即監(jiān)聽某個事件,當(dāng)事件發(fā)生時脱货,再執(zhí)行相應(yīng)的操作(比如點(diǎn)擊岛都、mouseover等)律姨。

HTTP請求的狀態(tài)碼

XHR.redyState:存儲的xhr對象生命周期
1
2
3
4
XHR.status:存儲的是HTTP協(xié)議的狀態(tài)碼
200 請求成功 ok
300 請求跳轉(zhuǎn)
400 請求失敗
403 被禁止 forbidden
404 未找到 page not found

請求的監(jiān)聽事件

  • XHR.redyState:當(dāng)你希望捕捉請求對象的不同狀態(tài),那么就使用 XHR.redyState
  • XHR.status:當(dāng)你希望捕捉http的狀態(tài)臼疫,那么就使用XHR.status

xhr.readystate&&xhr.status :捕捉兩種狀態(tài)

readystatechangge和Load區(qū)別

readystatechange 事件先于 load 事件執(zhí)行择份。load 事件就相當(dāng)于 readyState 的值為 4 后觸發(fā)的事件。如果不需要跟蹤請求返回之前的過程時,用 load 事件更省事兒。

示例:成功

   const xhr =new XMLHttpRequest()
        const url = "https://jsonplaceholder.typicode.com/todos"
        xhr.addEventListener("load",()=>{
            if(xhr.readyState === 4 && xhr.status === 200){
                // console.log(xhr.response);
                console.log(xhr.readyState,xhr.status);//4 200
            }else{
                console.log(xhr.readyState,xhr.status);
            }
        })
        xhr.addEventListener("readystatechange",function(){
            if(xhr.readyState === 4 && xhr.status === 200){
                // console.log(xhr.response);
                console.log(xhr.readyState,xhr.status);//1 0=>2 200 => 3 200 => 4 200
            }else{
                console.log(xhr.readyState,xhr.status);
            }
        })
        xhr.open("GET",url,true)
        xhr.send()
        //項(xiàng)目中如何寫請求

示例:load失敗
load 事件:

  • 就算沒有拿到數(shù)據(jù)xhr.readyState返回4
  • xhr.status:404
  • xhr.statusText:Not Found

xhr.statusText:返回一個包含的響應(yīng)的狀況的消息以返回通過HTTP服務(wù)器尔破。 不像 XMLHTTPRequest.status它指示一個數(shù)值狀況代碼讨越,這個字符串中包含的 http的響應(yīng)的狀態(tài)。

 const xhr =new XMLHttpRequest()
        const url = "https://jsonplaceholder.typicode.com/todos"
        xhr.addEventListener("load",()=>{
            if(xhr.readyState === 4 && xhr.status === 200){
                console.log(JSON.parse(xhr.response));
                console.log(xhr.readyState,xhr.status);//4 200
            }else{
                console.log(xhr.readyState,xhr.status,xhr.statusText);//4 404 Not Found
            }
        })

示例:封裝一個HTTP請求

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剩燥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立倍,死亡現(xiàn)場離奇詭異灭红,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)口注,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門比伏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疆导,你說我怎么就攤上這事赁项。” “怎么了澈段?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵悠菜,是天一觀的道長。 經(jīng)常有香客問我败富,道長悔醋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任兽叮,我火速辦了婚禮芬骄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹦聪。我一直安慰自己账阻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布泽本。 她就那樣靜靜地躺著淘太,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒲牧,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天撇贺,我揣著相機(jī)與錄音,去河邊找鬼冰抢。 笑死松嘶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挎扰。 我是一名探鬼主播喘蟆,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鼓鲁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起港谊,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骇吭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歧寺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燥狰,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年斜筐,在試婚紗的時候發(fā)現(xiàn)自己被綠了龙致。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顷链,死狀恐怖目代,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗤练,我是刑警寧澤榛了,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站煞抬,受9級特大地震影響霜大,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜革答,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一战坤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧残拐,春花似錦途茫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春边败,著一層夾襖步出監(jiān)牢的瞬間袱衷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工笑窜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留致燥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓排截,卻偏偏與公主長得像嫌蚤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子断傲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • JS是一門單線程脱吱、非阻塞、異步认罩、并發(fā)的語言JS里面有調(diào)用棧箱蝠、一個事件循環(huán)、一個回調(diào)隊(duì)列阻塞其實(shí)asynchrono...
    爛好人_5b0f閱讀 594評論 0 1
  • 1. javascript的typeof返回哪些數(shù)據(jù)類型. 答案:string,boolean,number,un...
    townof1997閱讀 247評論 0 0
  • 1. 閉包 閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù)垦垂,創(chuàng)建閉包的最常見的方式就是在函數(shù)內(nèi)創(chuàng)建函數(shù)宦搬,通過函數(shù)訪問...
    抽瘋的稻草繩閱讀 1,361評論 0 26
  • 1. 閉包 閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在函數(shù)內(nèi)創(chuàng)建函數(shù)劫拗,通過函數(shù)訪問...
    Marvel_Dreamer閱讀 3,501評論 0 21
  • Javascript是一門:單線程间校,非阻塞,異步页慷,并發(fā)的語言憔足。棧:有順序,不可修改酒繁;堆:沒有做順序排序(很亂)四瘫,可...
    憂油魚閱讀 694評論 0 0