欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

JavaScript中的Event Loop(事件循環)機制

2020-5-25    seo達人

事件循環

JavaScript是單線程,非阻塞的

瀏覽器的事件循環


執行棧和事件隊列

宏任務和微任務

node環境下的事件循環


和瀏覽器環境有何不同

事件循環模型

宏任務和微任務

經典題目分析

1. JavaScript是單線程,非阻塞的

單線程:


JavaScript的主要用途是與用戶互動,以及操作DOM。如果它是多線程的會有很多復雜的問題要處理,比如有兩個線程同時操作DOM,一個線程刪除了當前的DOM節點,一個線程是要操作當前的DOM階段,最后以哪個線程的操作為準?為了避免這種,所以JS是單線程的。即使H5提出了web worker標準,它有很多限制,受主線程控制,是主線程的子線程。


非阻塞:通過 event loop 實現。


2. 瀏覽器的事件循環

執行棧和事件隊列

為了更好地理解Event Loop,請看下圖(轉引自Philip Roberts的演講 《Help, I'm stuck in an event-loop》)

Help, I'm stuck in an event-loop


執行棧: 同步代碼的執行,按照順序添加到執行棧中


function a() {

   b();

   console.log('a');

}

function b() {

   console.log('b')

}

a();

我們可以通過使用 Loupe(Loupe是一種可視化工具,可以幫助您了解JavaScript的調用堆棧/事件循環/回調隊列如何相互影響)工具來了解上面代碼的執行情況。


調用情況


執行函數 a()先入棧

a()中先執行函數 b() 函數b() 入棧

執行函數b(), console.log('b') 入棧

輸出 b, console.log('b')出棧

函數b() 執行完成,出棧

console.log('a') 入棧,執行,輸出 a, 出棧

函數a 執行完成,出棧。

事件隊列: 異步代碼的執行,遇到異步事件不會等待它返回結果,而是將這個事件掛起,繼續執行執行棧中的其他任務。當異步事件返回結果,將它放到事件隊列中,被放入事件隊列不會立刻執行起回調,而是等待當前執行棧中所有任務都執行完畢,主線程空閑狀態,主線程會去查找事件隊列中是否有任務,如果有,則取出排在第一位的事件,并把這個事件對應的回調放到執行棧中,然后執行其中的同步代碼。


我們再上面代碼的基礎上添加異步事件,


function a() {

   b();

   console.log('a');

}

function b() {

   console.log('b')

   setTimeout(function() {

       console.log('c');

   }, 2000)

}

a();

此時的執行過程如下

img


我們同時再加上點擊事件看一下運行的過程


$.on('button', 'click', function onClick() {

   setTimeout(function timer() {

       console.log('You clicked the button!');    

   }, 2000);

});


console.log("Hi!");


setTimeout(function timeout() {

   console.log("Click the button!");

}, 5000);


console.log("Welcome to loupe.");

img


簡單用下面的圖進行一下總結


執行棧和事件隊列


宏任務和微任務

為什么要引入微任務,只有一種類型的任務不行么?


頁面渲染事件,各種IO的完成事件等隨時被添加到任務隊列中,一直會保持先進先出的原則執行,我們不能準確地控制這些事件被添加到任務隊列中的位置。但是這個時候突然有高優先級的任務需要盡快執行,那么一種類型的任務就不合適了,所以引入了微任務隊列。


不同的異步任務被分為:宏任務和微任務

宏任務:


script(整體代碼)

setTimeout()

setInterval()

postMessage

I/O

UI交互事件

微任務:


new Promise().then(回調)

MutationObserver(html5 新特性)

運行機制

異步任務的返回結果會被放到一個任務隊列中,根據異步事件的類型,這個事件實際上會被放到對應的宏任務和微任務隊列中去。


在當前執行棧為空時,主線程會查看微任務隊列是否有事件存在


存在,依次執行隊列中的事件對應的回調,直到微任務隊列為空,然后去宏任務隊列中取出最前面的事件,把當前的回調加到當前指向棧。

如果不存在,那么再去宏任務隊列中取出一個事件并把對應的回到加入當前執行棧;

當前執行棧執行完畢后時會立刻處理所有微任務隊列中的事件,然后再去宏任務隊列中取出一個事件。同一次事件循環中,微任務永遠在宏任務之前執行。


在事件循環中,每進行一次循環操作稱為 tick,每一次 tick 的任務處理模型是比較復雜的,但關鍵步驟如下:


執行一個宏任務(棧中沒有就從事件隊列中獲取)

執行過程中如果遇到微任務,就將它添加到微任務的任務隊列中

宏任務執行完畢后,立即執行當前微任務隊列中的所有微任務(依次執行)

當前宏任務執行完畢,開始檢查渲染,然后GUI線程接管渲染

渲染完畢后,JS線程繼續接管,開始下一個宏任務(從事件隊列中獲取)

簡單總結一下執行的順序:

執行宏任務,然后執行該宏任務產生的微任務,若微任務在執行過程中產生了新的微任務,則繼續執行微任務,微任務執行完畢后,再回到宏任務中進行下一輪循環。


宏任務和微任務


深入理解js事件循環機制(瀏覽器篇) 這邊文章中有個特別形象的動畫,大家可以看著理解一下。


console.log('start')


setTimeout(function() {

 console.log('setTimeout')

}, 0)


Promise.resolve().then(function() {

 console.log('promise1')

}).then(function() {

 console.log('promise2')

})


console.log('end')

瀏覽器事件循環


全局代碼壓入執行棧執行,輸出 start

setTimeout壓入 macrotask隊列,promise.then 回調放入 microtask隊列,最后執行 console.log('end'),輸出 end

調用棧中的代碼執行完成(全局代碼屬于宏任務),接下來開始執行微任務隊列中的代碼,執行promise回調,輸出 promise1, promise回調函數默認返回 undefined, promise狀態變成 fulfilled ,觸發接下來的 then回調,繼續壓入 microtask隊列,此時產生了新的微任務,會接著把當前的微任務隊列執行完,此時執行第二個 promise.then回調,輸出 promise2

此時,microtask隊列 已清空,接下來會會執行 UI渲染工作(如果有的話),然后開始下一輪 event loop, 執行 setTimeout的回調,輸出 setTimeout

最后的執行結果如下


start

end

promise1

promise2

setTimeout

node環境下的事件循環

和瀏覽器環境有何不同

表現出的狀態與瀏覽器大致相同。不同的是 node 中有一套自己的模型。node 中事件循環的實現依賴 libuv 引擎。Node的事件循環存在幾個階段。


如果是node10及其之前版本,microtask會在事件循環的各個階段之間執行,也就是一個階段執行完畢,就會去執行 microtask隊列中的任務。


node版本更新到11之后,Event Loop運行原理發生了變化,一旦執行一個階段里的一個宏任務(setTimeout,setInterval和setImmediate)就立刻執行微任務隊列,跟瀏覽器趨于一致。下面例子中的代碼是按照的去進行分析的。


事件循環模型

┌───────────────────────┐

┌─>│        timers         │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

│  │     I/O callbacks     │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

│  │     idle, prepare     │

│  └──────────┬────────────┘      ┌───────────────┐

│  ┌──────────┴────────────┐      │   incoming:   │

│  │         poll          │<──connections───     │

│  └──────────┬────────────┘      │   data, etc.  │

│  ┌──────────┴────────────┐      └───────────────┘

│  │        check          │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

└──┤    close callbacks    │

  └───────────────────────┘

事件循環各階段詳解

node中事件循環的順序


外部輸入數據 --> 輪詢階段(poll) --> 檢查階段(check) --> 關閉事件回調階段(close callback) --> 定時器檢查階段(timer) --> I/O 事件回調階段(I/O callbacks) --> 閑置階段(idle, prepare) --> 輪詢階段...


這些階段大致的功能如下:


定時器檢測階段(timers): 這個階段執行定時器隊列中的回調如 setTimeout() 和 setInterval()。

I/O事件回調階段(I/O callbacks): 這個階段執行幾乎所有的回調。但是不包括close事件,定時器和setImmediate()的回調。

閑置階段(idle, prepare): 這個階段僅在內部使用,可以不必理會

輪詢階段(poll): 等待新的I/O事件,node在一些特殊情況下會阻塞在這里。

檢查階段(check): setImmediate()的回調會在這個階段執行。

關閉事件回調階段(close callbacks): 例如socket.on('close', ...)這種close事件的回調

poll:

這個階段是輪詢時間,用于等待還未返回的 I/O 事件,比如服務器的回應、用戶移動鼠標等等。

這個階段的時間會比較長。如果沒有其他異步任務要處理(比如到期的定時器),會一直停留在這個階段,等待 I/O 請求返回結果。

check:

該階段執行setImmediate()的回調函數。


close:

該階段執行關閉請求的回調函數,比如socket.on('close', ...)。


timer階段:

這個是定時器階段,處理setTimeout()和setInterval()的回調函數。進入這個階段后,主線程會檢查一下當前時間,是否滿足定時器的條件。如果滿足就執行回調函數,否則就離開這個階段。


I/O callback階段:

除了以下的回調函數,其他都在這個階段執行:


setTimeout()和setInterval()的回調函數

setImmediate()的回調函數

用于關閉請求的回調函數,比如socket.on('close', ...)

宏任務和微任務

宏任務:


setImmediate

setTimeout

setInterval

script(整體代碼)

I/O 操作等。

微任務:


process.nextTick

new Promise().then(回調)

Promise.nextTick, setTimeout, setImmediate的使用場景和區別

Promise.nextTick

process.nextTick 是一個獨立于 eventLoop 的任務隊列。

在每一個 eventLoop 階段完成后會去檢查 nextTick 隊列,如果里面有任務,會讓這部分任務優先于微任務執行。

是所有異步任務中最快執行的。


setTimeout:

setTimeout()方法是定義一個回調,并且希望這個回調在我們所指定的時間間隔后第一時間去執行。


setImmediate:

setImmediate()方法從意義上將是立刻執行的意思,但是實際上它卻是在一個固定的階段才會執行回調,即poll階段之后。


經典題目分析

一. 下面代碼輸出什么

async function async1() {

   console.log('async1 start');

   await async2();

   console.log('async1 end');

}

async function async2() {

   console.log('async2');

}

console.log('script start');

setTimeout(function() {

   console.log('setTimeout');

}, 0)

async1();

new Promise(function(resolve) {

   console.log('promise1');

   resolve();

}).then(function() {

   console.log('promise2');

});

console.log('script end');

先執行宏任務(當前代碼塊也算是宏任務),然后執行當前宏任務產生的微任務,然后接著執行宏任務


從上往下執行代碼,先執行同步代碼,輸出 script start

遇到setTimeout,現把 setTimeout 的代碼放到宏任務隊列中

執行 async1(),輸出 async1 start, 然后執行 async2(), 輸出 async2,把 async2() 后面的代碼 console.log('async1 end')放到微任務隊列中

接著往下執行,輸出 promise1,把 .then()放到微任務隊列中;注意Promise本身是同步的立即執行函數,.then是異步執行函數

接著往下執行, 輸出 script end。同步代碼(同時也是宏任務)執行完成,接下來開始執行剛才放到微任務中的代碼

依次執行微任務中的代碼,依次輸出 async1 end、 promise2, 微任務中的代碼執行完成后,開始執行宏任務中的代碼,輸出 setTimeout

最后的執行結果如下


script start

async1 start

async2

promise1

script end

async1 end

promise2

setTimeout

二. 下面代碼輸出什么

console.log('start');

setTimeout(() => {

   console.log('children2');

   Promise.resolve().then(() => {

       console.log('children3');

   })

}, 0);


new Promise(function(resolve, reject) {

   console.log('children4');

   setTimeout(function() {

       console.log('children5');

       resolve('children6')

   }, 0)

}).then((res) => {

   console.log('children7');

   setTimeout(() => {

       console.log(res);

   }, 0)

})

這道題跟上面題目不同之處在于,執行代碼會產生很多個宏任務,每個宏任務中又會產生微任務


從上往下執行代碼,先執行同步代碼,輸出 start

遇到setTimeout,先把 setTimeout 的代碼放到宏任務隊列①中

接著往下執行,輸出 children4, 遇到setTimeout,先把 setTimeout 的代碼放到宏任務隊列②中,此時.then并不會被放到微任務隊列中,因為 resolve是放到 setTimeout中執行的

代碼執行完成之后,會查找微任務隊列中的事件,發現并沒有,于是開始執行宏任務①,即第一個 setTimeout, 輸出 children2,此時,會把 Promise.resolve().then放到微任務隊列中。

宏任務①中的代碼執行完成后,會查找微任務隊列,于是輸出 children3;然后開始執行宏任務②,即第二個 setTimeout,輸出 children5,此時將.then放到微任務隊列中。

宏任務②中的代碼執行完成后,會查找微任務隊列,于是輸出 children7,遇到 setTimeout,放到宏任務隊列中。此時微任務執行完成,開始執行宏任務,輸出 children6;

最后的執行結果如下


start

children4

children2

children3

children5

children7

children6

三. 下面代碼輸出什么

const p = function() {

   return new Promise((resolve, reject) => {

       const p1 = new Promise((resolve, reject) => {

           setTimeout(() => {

               resolve(1)

           }, 0)

           resolve(2)

       })

       p1.then((res) => {

           console.log(res);

       })

       console.log(3);

       resolve(4);

   })

}



p().then((res) => {

   console.log(res);

})

console.log('end');

執行代碼,Promise本身是同步的立即執行函數,.then是異步執行函數。遇到setTimeout,先把其放入宏任務隊列中,遇到p1.then會先放到微任務隊列中,接著往下執行,輸出 3

遇到 p().then 會先放到微任務隊列中,接著往下執行,輸出 end

同步代碼塊執行完成后,開始執行微任務隊列中的任務,首先執行 p1.then,輸出 2, 接著執行p().then, 輸出 4

微任務執行完成后,開始執行宏任務,setTimeout, resolve(1),但是此時 p1.then已經執行完成,此時 1不會輸出。

最后的執行結果如下


3

end

2

4

你可以將上述代碼中的 resolve(2)注釋掉, 此時 1才會輸出,輸出結果為 3 end 4 1。


const p = function() {

   return new Promise((resolve, reject) => {

       const p1 = new Promise((resolve, reject) => {

           setTimeout(() => {

               resolve(1)

           }, 0)

       })

       p1.then((res) => {

           console.log(res);

       })

       console.log(3);

       resolve(4);

   })

}



p().then((res) => {

   console.log(res);

})

console.log('end');

3

end

4

1

最后強烈推薦幾個非常好的講解 event loop 的視頻:


What the heck is the event loop anyway? | Philip Roberts | JSConf EU

Jake Archibald: In The Loop - JSConf.Asia

日歷

鏈接

個人資料

藍藍設計的小編 http://m.ocunn.cn

存檔

欧美黑人激情| 日韩精品一区二区三区中文精品| 久久精品水蜜桃av综合天堂| 黑人巨大精品欧美一区| 亚洲区一区二| 中文字幕一区二区三区乱码图片 | 日本10禁啪啪无遮挡免费一区二区| 国产欧美va欧美va香蕉在线| 日本精品免费一区二区三区| 久久99精品久久久久久青青91 | 日本在线不卡视频一二三区| 亚洲大胆在线| 在线成人h网| 欧美日韩少妇| 狠狠爱成人网| 国语自产精品视频在线看8查询8| 999国产精品| 日韩精品一区二区久久| 精品欧美久久| 欧美mv日韩| 51精产品一区一区三区| 综合久久十次| 在线观看视频日韩| 国产精品久久777777毛茸茸| 在线午夜精品| 丝袜国产日韩另类美女| 天堂成人免费av电影一区| 久久中文精品| 美女一区二区三区| 国产麻豆精品久久一二三| 国产精品中文字幕日韩精品| 中文字幕精品在线播放| 任我爽在线视频精品一| 欧美日韩中字一区| 欧美色窝79yyyycom| 欧美在线啊v一区| 欧美日韩国产精品成人| 日韩一级二级三级精品视频| 精品成人私密视频| 亚洲欧美一区二区三区四区| 最近中文字幕2019免费| 欧美成人精品在线视频| 91精品国产精品| 国产高清视频一区三区| 成人国产精品一区| 极品校花啪啪激情久久| 亚洲欧洲一区二区在线观看| 精品国产三级a∨在线| 鲁一鲁一鲁一鲁一色| 日韩在线第三页| 91精品人妻一区二区三区蜜桃2| 国产精品无码网站| 欧洲猛交xxxx乱大交3| 可以免费看的av毛片| 一道本无吗一区| 日韩在线视频第一页| 黄色毛片在线观看| japanese色国产在线看视频| 欧美一级在线| 亚洲宅男网av| 午夜欧美理论片| 免费观看在线色综合| 99久久综合99久久综合网站| 亚洲日本成人在线观看| 在线免费观看日本一区| 亚洲国产精久久久久久| 最近2019中文字幕mv免费看| 欧美影院久久久| 国产伦精品一区二区三区照片91| 日韩第一页在线观看| www日韩在线观看| 人妻大战黑人白浆狂泄| 久久久精品免费看| 欧美一区二不卡视频| 午夜免费福利在线观看| 日本高清不卡一区二区三区视频 | 精品女同一区二区三区在线观看| 任你躁在线精品免费| 黄色日韩在线| 成人网在线播放| 一区二区三区四区在线播放| 9191久久久久久久久久久| 中文字幕欧美亚洲| 国产精品永久免费观看| 亚洲国产日韩欧美| 羞羞的视频在线| 国产又粗又长又黄的视频| 久操视频在线免费观看| 中文av在线播放| 久久影院午夜精品| 神马午夜久久| 日本在线不卡一区| 国产精品福利一区| 精品欧美久久久| 91国内在线视频| 欧美国产一区二区在线| 杨幂毛片午夜性生毛片 | 国产精品人成电影| 国产又黄又爽免费视频| 免费在线观看日韩av| 日本少妇激情视频| 一区二区三区不卡在线视频| 自拍视频在线看| 日韩理论片av| 成人污污视频在线观看| 欧美日韩一区二区精品| 日韩中文字幕在线| 99久久精品无码一区二区毛片| 国产乱淫av片杨贵妃| 一卡二卡三卡四卡| 99er热精品视频| 黄色成人在线网| 婷婷精品在线观看| 精品一区二区精品| 欧美性猛交xxxx| 久久成人精品一区二区三区| 久久精品国产美女| 欧洲美女亚洲激情| av片免费观看| 国产色在线观看| 午夜先锋成人动漫在线| 国产在线观看一区二区| 一本色道a无线码一区v| 欧美区二区三区| 日韩在线电影一区| 亚洲乱码国产乱码精品精大量| 国产尤物在线观看| 国产高清中文字幕在线| 我不卡伦不卡影院| 国产欧美视频在线观看| 亚洲国产精品一区二区久| 成人a在线观看| 四季av一区二区| 五月天激情国产综合婷婷婷| 一区二区三区视频在线观看视频| 爽爽窝窝午夜精品一区二区| 国产91富婆露脸刺激对白| 欧美日韩国产美| 国产精品入口夜色视频大尺度| 国产色一区二区三区| 日本a级片视频| 成人精品一区| 深爱激情久久| 久久久久久久久久电影| 日韩电影第一页| 国严精品久久久久久亚洲影视 | 欧美激情精品久久久久久久变态 | 成年人在线看| 日韩精品第一区| 亚洲欧美一区二区视频| 在线观看国产成人av片| 亚洲精品在线观看免费| 91成人在线免费视频| 中日韩一区二区三区| 欧美一区 二区| 久久久久久亚洲综合| 亚洲精品中文字幕女同| 欧美一区二区三区四区夜夜大片 | 欧美剧情电影在线观看完整版免费励志电影| 欧美中文字幕精品| 欧美丰满熟妇xxxxx| 一区二区乱子伦在线播放| 免费成人动漫| 久久国产精品99久久久久久老狼| 欧美片网站yy| 国产一区免费视频| 微拍福利一区二区| 免费黄网站在线播放| 欧美黄色一区| wwwwwxxxx日本| 黄色三级生活片| 成人免费在线视频网| 少妇精品久久久一区二区| 日本一二三四高清不卡| 欧美老肥婆性猛交视频| 3d动漫一区二区三区| 中文字幕视频一区二区| av在线国产精品| 久久色视频免费观看| 最近2019年日本中文免费字幕| 女女百合国产免费网站| 中文字幕激情小说| yiren22亚洲综合| 成人av资源在线观看| 中文字幕免费精品一区| 国产精彩视频一区二区| 中文字幕制服诱惑| 亚洲一区二区三区日本久久九| 久久看人人爽人人| 欧美激情在线观看| 在线播放免费视频| 天堂在线第六区| 一本精品一区二区三区| 欧洲视频一区二区| 国产一区精品在线| 免费在线黄色片| av免费在线一区| 26uuu亚洲综合色| 欧美精品久久一区二区| 三级黄色片播放| 噜噜噜在线观看播放视频| 一区二区三区四区电影| 欧美日本一区二区| 亚洲国产精品毛片| 国产九色91回来了| 色综合久久中文| 精品久久久久久中文字幕一区奶水| 亚洲在线免费观看| 色欲人妻综合网| 日韩精选视频| 国产精品久久久久久久久免费樱桃| 91成人在线播放| 国产精品久久久久久亚洲色| 欧美高清视频| 国产精品综合视频| 九九热r在线视频精品| 国产传媒免费观看| 中文字幕日本在线观看| 麻豆91精品91久久久的内涵| 在线日韩第一页| 亚洲自拍第三页| 大片免费播放在线视频| 蜜臀久久久99精品久久久久久| 亚洲丝袜在线视频| 不卡的av中文字幕| 在线免费黄色| 国产成人在线电影| 久久免费高清视频| aaaaa一级片| 自拍偷拍亚洲视频| 国产精品久久一级| 91天堂在线观看| 国产无遮挡裸体免费视频| 欧美中文高清| 欧美日韩国产激情| 精品精品国产高清一毛片一天堂| 久久综合久久99| 久久久成人精品| 精品人妻二区中文字幕| 羞羞电影在线观看www| heyzo一本久久综合| 国产精品久久久久久久av电影 | 欧美日韩亚洲视频| 亚洲国产欧美日韩| 黄色三级网站在线观看| 一本一道久久综合狠狠老精东影业| 日韩久久精品电影| 国产老头和老头xxxx×| 17videosex性欧美| 一色屋精品亚洲香蕉网站| 久久国产精品亚洲va麻豆| 91美女精品网站| 亚洲高清免费| 久热精品视频在线| 精品人妻一区二区三区蜜桃视频| 成人h在线观看| 欧美日韩加勒比精品一区| 国产精品12p| 男女视频在线观看免费| 粉嫩在线一区二区三区视频| 国产热re99久久6国产精品| 久久夜靖品2区| 99精品视频在线| 一区二区三区亚洲| 少妇真人直播免费视频| 久久9999免费视频| 91精选在线观看| 欧美大尺度做爰床戏| free性欧美16hd| 亚洲五码中文字幕| 男人草女人视频| av在线播放网| 国产免费成人在线视频| 麻豆av一区二区三区久久| 人妻妺妺窝人体色www聚色窝| 久久99久久久欧美国产| 国产激情综合五月久久| 一本色道久久88综合亚洲精品ⅰ| 亚洲最大成人免费视频| 国产强伦人妻毛片| 视频一区视频二区中文字幕| 日韩av免费在线| 国产情侣免费视频| 六月婷婷一区| 日韩免费观看av| 中日韩av在线| 日本成人在线视频网站| 国产在线拍偷自揄拍精品| 92久久精品一区二区| 日本欧美加勒比视频| 国产精品激情av在线播放| 亚洲一区在线观| 美女看a上一区| 91免费国产视频| 亚洲黄色精品视频| 成人黄色网址在线观看| 精品无人区一区二区三区 | 极品销魂美女一区二区三区| 91蜜桃网站免费观看| 五月婷婷开心中文字幕| 成人美女视频在线观看| 欧美成人一区二区在线| 黄色视屏网站在线免费观看| 国产欧美日韩视频在线观看| 欧美性视频在线播放| 网友自拍视频在线| 亚洲国产aⅴ天堂久久| 欧在线一二三四区| 99久久精品一区二区成人| 日韩三级视频在线看| 成年人网站免费在线观看| 日韩精品丝袜美腿| 精品中文字幕在线| 丰满人妻一区二区三区四区| 狠狠色丁香久久婷婷综合丁香| 国产一区精品视频| 爱久久·www| 欧美日韩精品在线| 精品无码av一区二区三区不卡| 1204国产成人精品视频| 伊人久久五月天| 欧美日韩综合在线观看| 免费在线欧美视频| 麻豆久久久9性大片| 免费网站黄在线观看| 在线观看日韩一区| jizz日本免费| 亚洲午夜精品一区 二区 三区| 日韩av大片免费看| 22288色视频在线观看| 亚洲国产精品成人综合 | 国产尤物精品| 91蜜桃网站免费观看| 成人不用播放器| 色香蕉成人二区免费| 久久av无码精品人妻系列试探| 五月婷婷六月综合| 视频一区二区三区在线看免费看 | 搞黄视频免费在线观看| 午夜亚洲国产au精品一区二区| 中文字幕中文在线| 免费视频一区三区| 欧美亚洲在线视频| 色婷婷av一区二区三区之红樱桃| 亚洲欧美怡红院| 亚洲欧美日韩精品一区| 天海翼亚洲一区二区三区| 午夜精品久久17c| 懂色av蜜臀av粉嫩av分享吧| 自拍偷拍国产精品| 91精品视频国产| 欧美黄色录像片| 成人亲热视频网站| youjizz在线播放| 欧美日韩美少妇| 成人在线观看高清| 久久福利视频一区二区| 在线精品亚洲一区二区| 欧美日韩卡一| 欧美成人自拍视频| 免费看黄色一级视频| 亚洲午夜日本在线观看| 男生裸体视频网站| 亚洲精品免费观看| 色女人综合av| 久久亚洲国产精品尤物| 久久99久国产精品黄毛片入口| 亚洲欧美激情国产综合久久久| 亚洲乱码日产精品bd| 香港三级日本三级| 久久成人在线| 午夜啪啪福利视频| 4438全国亚洲精品观看视频| 欧美一区视频在线| 中文字幕在线视频区| 欧美精品一区二| 久草视频在线免费| 国产精品成人一区二区艾草 | 久久久久久国产免费a片| 日本伊人色综合网| 欧美极品少妇无套实战| 日韩av中文字幕一区| 成人免费网站在线观看| 中文字幕免费高清电视剧网站在线观看| 亚洲国产精品成人va在线观看| 波多野结衣一本一道| 国产精品久久久久精k8| 亚洲欧美日韩色| 日韩影院免费视频| a级黄色小视频| 国产一区2区| 久久国产日韩欧美| 日韩毛片免费看| 国产精品高潮粉嫩av| 18+激情视频在线| www.xxxx精品| 一级片免费在线| 亚洲成人精品av| 国产福利资源在线| 在线观看日韩av先锋影音电影院|