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

JavaScript內(nèi)部原理之變量對象

開發(fā) 前端
本文,我們介紹了JavaScript內(nèi)部原理之變量對象與執(zhí)行上下文相關(guān)的對象。希望,本文能夠?qū)Υ蠹矣兴鶐椭?,同時(shí)也希望本文能夠起到解惑的作用。

我們總是會在程序中定義一些函數(shù)和變量,之后會使用這些函數(shù)和變量來構(gòu)建我們的系統(tǒng)。

然而,對于解釋器來說,它又是如何以及從哪里找到這些數(shù)據(jù)的(函數(shù),變量)?當(dāng)引用一個(gè)對象的時(shí)候,在解釋器內(nèi)部又發(fā)生了什么?

許多ECMA腳本程序員都知道,變量和執(zhí)行上下文是密切相關(guān)的:

  1. var a = 10; // 全局上下文中的變量  
  2.    
  3. (function () {  
  4.   var b = 20; // 函數(shù)上下文中的本地變量  
  5. })();  
  6.    
  7. alert(a); // 10  
  8. alert(b); // "b" is not defined 

不僅如此,許多程序員也都知道,ECMAScript標(biāo)準(zhǔn)中指出獨(dú)立的作用域只有通過“函數(shù)代碼”(可執(zhí)行代碼類型中的一種)才能創(chuàng)建出來。比方說,與C/C++不同的是,在ECMAScript中for循環(huán)的代碼塊是無法創(chuàng)建本地上下文的:

  1. for (var k in {a: 1, b: 2}) {  
  2.   alert(k);  
  3. }  
  4.    
  5. alert(k); // 盡管循環(huán)已經(jīng)結(jié)束,但是變量“k”仍然在作用域中 

下面就來詳細(xì)介紹下,當(dāng)申明變量和函數(shù)的時(shí)候,究竟發(fā)生了什么。

數(shù)據(jù)申明

既然變量和執(zhí)行上下文有關(guān),那它就該知道數(shù)據(jù)存儲在哪里以及如何獲取。這種機(jī)制就稱作變量對象:

A variable object (in abbreviated form — VO) is a special object related with an execution context and which stores:

◆ variables (var, VariableDeclaration);

◆ function declarations (FunctionDeclaration, in abbreviated form FD);

◆ and function formal parameters

◆ declared in the context.

舉個(gè)例子,可以用ECMAScript的對象來表示變量對象:

  1. VO = {}; 

VO同時(shí)也是一個(gè)執(zhí)行上下文的屬性:

  1. activeExecutionContext = {  
  2.   VO: {  
  3.     // 上下文中的數(shù)據(jù) (變量申明(var), 函數(shù)申明(FD), 函數(shù)形參(function arguments))  
  4.   }  
  5. }; 

對變量的間接引用(通過VO的屬性名)只允許發(fā)生在全局上下文中的變量對象上(全局對象本身就是變量對象,這部分會在后續(xù)作相應(yīng)的介紹)。 對于其他的上下文而言,是無法直接引用VO的,因?yàn)閂O是實(shí)現(xiàn)層的。

申明新的變量和函數(shù)的過程其實(shí)就是在VO中創(chuàng)建新的和變量以及函數(shù)名對應(yīng)的屬性和屬性值的過程。

如下所示:

  1. var a = 10;  
  2.    
  3. function test(x) {  
  4.   var b = 20;  
  5. };  
  6.    
  7. test(30); 

上述代碼對應(yīng)的變量對象則如下所示:

  1. // 全局上下文中的變量對象  
  2. VO(globalContext) = {  
  3.   a: 10,  
  4.   test:   
  5. };  
  6.    
  7. // “test”函數(shù)上下文中的變量對象  
  8. VO(test functionContext) = {  
  9.   x: 30,  
  10.   b: 20  
  11. }; 

但是,在實(shí)現(xiàn)層(標(biāo)準(zhǔn)中定義的),變量對象只是一個(gè)抽象的概念。在實(shí)際執(zhí)行上下文中,VO可能完全不叫VO,并且初始的結(jié)構(gòu)也可能完全不同。

不同執(zhí)行上下文中的變量對象

變量對象上的一些操作(比如:變量的初始化)和行為對于所有的執(zhí)行上下文類型來說都已一樣的。從這一點(diǎn)來說,將變量對象表示成抽象的概念更加合適。 函數(shù)上下文還能定義額外的與變量對象相關(guān)的信息。

  1. AbstractVO (generic behavior of the variable instantiation process)  
  2.    
  3.   ║  
  4.   ╠══> GlobalContextVO  
  5.   ║        (VO === this === global)  
  6.   ║  
  7.   ╚══> FunctionContextVO  
  8.            (VO === AO,  object and  are added) 

接下來對這塊內(nèi)容進(jìn)行詳細(xì)介紹。

全局上下文中的變量對象

首先,有必要對全局對象(Global object)作個(gè)定義。

全局對象是一個(gè)在進(jìn)入任何執(zhí)行上下文前就創(chuàng)建出來的對象;此對象以單例形式存在;它的屬性在程序任何地方都可以直接訪問,其生命周期隨著程序的結(jié)束而終止。

全局對象在創(chuàng)建的時(shí)候,諸如Math,String,Date,parseInt等等屬性也會被初始化,同時(shí),其中一些對象會指向全局對象本身——比如,DOM中,全局對象上的window屬性就指向了全局對象(但是,并非所有的實(shí)現(xiàn)都是如此):

  1. global = {  
  2.   Math: ,  
  3.   String:   
  4.   ...  
  5.   ...  
  6.   window: global  
  7. }; 

在引用全局對象的屬性時(shí),前綴通??梢允÷裕?yàn)槿謱ο笫遣荒芡ㄟ^名字直接訪問的。然而,通過全局對象上的this值,以及通過如DOM中的window對象這樣遞歸引用的方式都可以訪問到全局對象:

  1. String(10); // 等同于 global.String(10);  
  2.    
  3. // 帶前綴  
  4. window.a = 10; // === global.window.a = 10 === global.a = 10;  
  5. this.b = 20; // global.b = 20; 

回到全局上下文的變量對象上——這里變量對象就是全局對象本身:

  1. VO(globalContext) === global; 

準(zhǔn)確地理解這個(gè)事實(shí)是非常必要的:正是由于這個(gè)原因,當(dāng)在全局上下文中申明一個(gè)變量時(shí),可以通過全局對象上的屬性來間地引用該變量(比方說,當(dāng)變量名提前未知的情況下)

  1. var a = new String('test');  
  2.    
  3. alert(a); // directly, is found in VO(globalContext): "test"  
  4.    
  5. alert(window['a']); // indirectly via global === VO(globalContext): "test"  
  6. alert(a === this.a); // true  
  7.    
  8. var aKey = 'a';  
  9. alert(window[aKey]); // indirectly, with dynamic property name: "test" 

函數(shù)上下文中的變量對象

在函數(shù)的執(zhí)行上下文中,VO是不能直接訪問的。它主要扮演被稱作活躍對象(activation object)(簡稱:AO)的角色。

  1. VO(functionContext) === AO; 

活躍對象會在進(jìn)入函數(shù)上下文的時(shí)候創(chuàng)建出來,初始化的時(shí)候會創(chuàng)建一個(gè)arguments屬性,其值就是Arguments對象:

  1. AO = {  
  2.   arguments:   
  3. }; 

Arguments對象是活躍對象上的屬性,它包含了如下屬性:

◆ callee —— 對當(dāng)前函數(shù)的引用

◆ length —— 實(shí)參的個(gè)數(shù)

◆ properties-indexes(數(shù)字,轉(zhuǎn)換成字符串)其值是函數(shù)參數(shù)的值(參數(shù)列表中,從左到右)。properties-indexes的個(gè)數(shù) == arguments.length;

arguments對象的properties-indexes的值和當(dāng)前(實(shí)際傳遞的)形參是共享的。

如下所示:

  1. function foo(x, y, z) {  
  2.    
  3.   // 定義的函數(shù)參數(shù)(x,y,z)的個(gè)數(shù)  
  4.   alert(foo.length); // 3  
  5.    
  6.   // 實(shí)際傳遞的參數(shù)個(gè)數(shù)  
  7.   alert(arguments.length); // 2  
  8.    
  9.   // 引用函數(shù)自身  
  10.   alert(arguments.callee === foo); // true  
  11.    
  12.   // 參數(shù)互相共享  
  13.    
  14.   alert(x === arguments[0]); // true  
  15.   alert(x); // 10  
  16.    
  17.   arguments[0] = 20;  
  18.   alert(x); // 20  
  19.    
  20.   x = 30;  
  21.   alert(arguments[0]); // 30  
  22.    
  23.   // 然而,對于沒有傳遞的參數(shù)z,  
  24.   // 相關(guān)的arguments對象的index-property是不共享的  
  25.    
  26.   z = 40;  
  27.   alert(arguments[2]); // undefined  
  28.    
  29.   arguments[2] = 50;  
  30.   alert(z); // 40  
  31.    
  32. }  
  33.    
  34. foo(10, 20); 

上述例子,在當(dāng)前的Google Chrome瀏覽器中有個(gè)bug——參數(shù)z和arguments[2]也是互相共享的。

處理上下文代碼的幾個(gè)階段

至此,也就到了本文最核心的部分了。處理執(zhí)行上下文代碼分為兩個(gè)階段:

進(jìn)入執(zhí)行上下文

執(zhí)行代碼

對變量對象的修改和這兩個(gè)階段密切相關(guān)。

要注意的是,這兩個(gè)處理階段是通用的行為,與上下文類型無關(guān)(不管是全局上下文還是函數(shù)上下文都是一致的)。

進(jìn)入執(zhí)行上下文

一旦進(jìn)入執(zhí)行上下文(在執(zhí)行代碼之前),VO就會被一些屬性填充(在此前已經(jīng)描述過了):

◆ 函數(shù)的形參(當(dāng)進(jìn)入函數(shù)執(zhí)行上下文時(shí))

—— 變量對象的一個(gè)屬性,其屬性名就是形參的名字,其值就是實(shí)參的值;對于沒有傳遞的參數(shù),其值為undefined

◆ 函數(shù)申明(FunctionDeclaration, FD) —— 變量對象的一個(gè)屬性,其屬性名和值都是函數(shù)對象創(chuàng)建出來的;如果變量對象已經(jīng)包含了相同名字的屬性,則替換它的值

◆ 變量申明(var,VariableDeclaration) —— 變量對象的一個(gè)屬性,其屬性名即為變量名,其值為undefined;如果變量名和已經(jīng)申明的函數(shù)名或者函數(shù)的參數(shù)名相同,則不會影響已經(jīng)存在的屬性。

看下面這個(gè)例子:

  1. function test(a, b) {  
  2.   var c = 10;  
  3.   function d() {}  
  4.   var e = function _e() {};  
  5.   (function x() {});  
  6. }  
  7.    
  8. test(10); // call 

當(dāng)以10為參數(shù)進(jìn)入“test”函數(shù)上下文的時(shí)候,對應(yīng)的AO如下所示:

  1. AO(test) = {  
  2.   a: 10,  
  3.   b: undefined,  
  4.   c: undefined,  
  5.   d: <reference to FunctionDeclaration "d">  
  6.   e: undefined  
  7. }; 

注意了,上面的AO并不包含函數(shù)“x”。這是因?yàn)檫@里的“x”并不是函數(shù)申明而是函數(shù)表達(dá)式(FunctionExpression,簡稱FE),函數(shù)表達(dá)式不會對VO造成影響。 盡管函數(shù)“_e”也是函數(shù)表達(dá)式,然而,正如我們所看到的,由于它被賦值給了變量“e”,因此它可以通過“e”來訪問到。關(guān)于函數(shù)申明和函數(shù)表達(dá)式的區(qū)別會在第五章——函數(shù)作具體介紹。

至此,處理上下文代碼的第一階段介紹完了,接下來介紹第二階段——執(zhí)行代碼階段。

執(zhí)行代碼

此時(shí),AO/VO的屬性已經(jīng)填充好了。(盡管,大部分屬性都還沒有賦予真正的值,都只是初始化時(shí)候的undefined值)。

繼續(xù)以上一例子為例,到了執(zhí)行代碼階段,AO/VO就會修改成為如下形式:

  1. AO['c'] = 10;  
  2. AO['e'] = ; 

再次注意到,這里函數(shù)表達(dá)式“_e”仍在內(nèi)存中,這是因?yàn)樗槐4嬖谏昝鞯淖兞?ldquo;e”中,而同樣是函數(shù)表達(dá)式的“x”卻不在AO/VO中: 如果嘗試在定義前或者定義后調(diào)用“x”函數(shù),這時(shí)會發(fā)生“x為定義”的錯(cuò)誤。未保存的函數(shù)表達(dá)式只有在定義或者遞歸時(shí)才能調(diào)用。

如下是更加典型的例子:

  1. alert(x); // function  
  2.    
  3. var x = 10;  
  4. alert(x); // 10  
  5.    
  6. x = 20;  
  7.    
  8. function x() {};  
  9.    
  10. alert(x); // 20 

上述例子中,為何“x”打印出來是函數(shù)呢?為何在申明前就可以訪問到?又為何不是10或者20呢?原因在于,根據(jù)規(guī)則——在進(jìn)入上下文的時(shí)候,VO會被填充函數(shù)申明; 同一階段,還有變量申明“x”,但是,正如此前提到的,變量申明是在函數(shù)申明和函數(shù)形參之后,并且,變量申明不會對已經(jīng)存在的同樣名字的函數(shù)申明和函數(shù)形參發(fā)生沖突, 因此,在進(jìn)入上下文的階段,VO填充為如下形式:

  1. VO = {};  
  2.    
  3. VO['x'] =   
  4.    
  5. // 發(fā)現(xiàn)var x = 10;  
  6. // 如果函數(shù)“x”還未定義  
  7. // 則 "x" 為undefined, 但是,在我們的例子中  
  8. // 變量申明并不會影響同名的函數(shù)值  
  9.    
  10. VO['x'] =  

隨后,在執(zhí)行代碼階段,VO被修改為如下所示:

  1. VO['x'] = 10;  
  2. VO['x'] = 20; 

正如在第二個(gè)和第三個(gè)alert顯示的那樣。

如下例子再次看到在進(jìn)入上下文階段,變量存儲在VO中(因此,盡管else的代碼塊永遠(yuǎn)都不會執(zhí)行到,而“b”卻仍然在VO中):

  1. if (true) {  
  2.   var a = 1;  
  3. else {  
  4.   var b = 2;  
  5. }  
  6.    
  7. alert(a); // 1  
  8. alert(b); // undefined, but not "b is not defined" 

關(guān)于變量

大多數(shù)講JavaScript的文章甚至是JavaScript的書通常都會這么說:“申明全局變量的方式有兩種,一種是使用var關(guān)鍵字(在全局上下文中),另外一種是不用var關(guān)鍵字(在任何位置)”。 而這樣的描述是錯(cuò)誤的。要記住的是:

使用var關(guān)鍵字是申明變量的唯一方式

如下賦值語句:

  1. a = 10;  

僅僅是在全局對象上創(chuàng)建了新的屬性(而不是變量)。“不是變量”并不意味著它無法改變,它是ECMAScript中變量的概念(它之后可以變?yōu)槿謱ο蟮膶傩?,因?yàn)閂O(globalContext) === global,還記得吧?)

不同點(diǎn)如下所示:

  1. alert(a); // undefined  
  2. alert(b); // "b" is not defined  
  3.    
  4. b = 10;  
  5. var a = 20; 

接下來還是要談到VO和在不同階段對VO的修改(進(jìn)入上下文階段和執(zhí)行代碼階段):

進(jìn)入上下文:

  1. VO = {  
  2.   a: undefined  
  3. }; 

我們看到,這個(gè)階段并沒有任何“b”,因?yàn)樗皇亲兞浚?ldquo;b”在執(zhí)行代碼階段才出現(xiàn)。(但是,在我們這個(gè)例子中也不會出現(xiàn),因?yàn)樵?ldquo;b”出現(xiàn)前就發(fā)生了錯(cuò)誤)

將上述代碼稍作改動:

  1. alert(a); // undefined, we know why  
  2.    
  3. b = 10;  
  4. alert(b); // 10, created at code execution  
  5.    
  6. var a = 20;  
  7. alert(a); // 20, modified at code execution 

這里關(guān)于變量還有非常重要的一點(diǎn):與簡單屬性不同的是,變量是不能刪除的{DontDelete},這意味著要想通過delete操作符來刪除一個(gè)變量是不可能的。

  1. a = 10;  
  2. alert(window.a); // 10  
  3.    
  4. alert(delete a); // true  
  5.    
  6. alert(window.a); // undefined  
  7.    
  8. var b = 20;  
  9. alert(window.b); // 20  
  10.    
  11. alert(delete b); // false  
  12.    
  13. alert(window.b); // still 20 

但是,這里有個(gè)例外,就是“eval”執(zhí)行上下文中,是可以刪除變量的:

  1. eval('var a = 10;');  
  2. alert(window.a); // 10  
  3.    
  4. alert(delete a); // true  
  5.    
  6. alert(window.a); // undefined 

利用某些debug工具,在終端測試過這些例子的童鞋要注意了:其中Firebug也是使用了eval來執(zhí)行終端的代碼。因此,這個(gè)時(shí)候var也是可以刪除的。

實(shí)現(xiàn)層的特性:__parent__屬性

正如此前介紹的,標(biāo)準(zhǔn)情況下,是無法直接訪問激活對象的。然而,在某些實(shí)現(xiàn)中,比如知名的SpiderMonkey和Rhino,函數(shù)有個(gè)特殊的屬性__parent__, 該屬性是對該函數(shù)創(chuàng)建所在的激活對象的引用(或者全局變量對象)。

如下所示(SpiderMonkey,Rhino):

  1. var global = this;  
  2. var a = 10;  
  3.    
  4. function foo() {}  
  5.    
  6. alert(foo.__parent__); // global  
  7.    
  8. var VO = foo.__parent__;  
  9.    
  10. alert(VO.a); // 10  
  11. alert(VO === global); // true 

上述例子中,可以看到函數(shù)foo是在全局上下文中創(chuàng)建的,相應(yīng)的,它的__parent__屬性設(shè)置為全局上下文的變量對象,比如說:全局對象。

然而,在SpiderMonkey中以相同的方式獲取激活對象是不可能的:不同的版本表現(xiàn)都不同,內(nèi)部函數(shù)的__parent__屬性會返回null或者全局對象。

在Rhino中,以相同的方式獲取激活對象是允許的:

如下所示(Rhino):

  1. var global = this;  
  2. var x = 10;  
  3.    
  4. (function foo() {  
  5.    
  6.   var y = 20;  
  7.    
  8.   // the activation object of the "foo" context  
  9.   var AO = (function () {}).__parent__;  
  10.    
  11.   print(AO.y); // 20  
  12.    
  13.   // __parent__ of the current activation  
  14.   // object is already the global object,  
  15.   // i.e. the special chain of variable objects is formed,  
  16.   // so-called, a scope chain  
  17.   print(AO.__parent__ === global); // true  
  18.    
  19.   print(AO.__parent__.x); // 10  
  20.    
  21. })(); 

總結(jié)

本文,我們介紹了與執(zhí)行上下文相關(guān)的對象。希望,本文能夠?qū)Υ蠹矣兴鶐椭?,同時(shí)也希望本文能夠起到解惑的作用。

說明

此文譯自Dmitry A.Soshnikov 的文章Variable object 。另,此文還有另外一位同事(宋珍珍)共同參譯

原文:http://goddyzhao.tumblr.com/post/11141710441/variable-object

【編輯推薦】

  1. 移動網(wǎng)站開發(fā)中常用的10段JavaScript代碼
  2. 5個(gè)有趣的JavaScript代碼片段分享
  3. JavaScript來實(shí)現(xiàn)的超炫組織結(jié)構(gòu)圖
  4. JavaScript的死與生
  5. JavaScript面向?qū)ο缶幊躺钊敕治?/a>
責(zé)任編輯:陳貽新 來源: goddyzhao
相關(guān)推薦

2010-10-08 10:26:45

JavaScript內(nèi)

2021-04-19 20:36:06

存儲Rust變量

2018-07-27 10:39:13

對象存儲Git

2020-03-12 11:29:51

JavaScript瀏覽器語言

2014-08-06 11:59:16

Xcode變量summary

2022-09-22 07:31:14

Java變量計(jì)算

2023-10-30 23:38:03

Rust編程基礎(chǔ)

2023-09-18 23:37:50

Kubernetes架構(gòu)

2009-09-14 10:35:15

Linq內(nèi)部執(zhí)行原理

2020-10-22 11:15:47

Go語言變量

2021-09-29 10:00:07

Go語言基礎(chǔ)

2021-10-13 10:00:52

Go語言基礎(chǔ)

2023-06-07 15:25:19

Kafka版本日志

2023-09-27 12:22:50

Kafka架構(gòu)

2010-11-12 11:07:03

sql server內(nèi)

2021-05-13 23:30:17

JavaScript 原理揭秘

2009-12-31 16:32:27

數(shù)據(jù)中心之變 系統(tǒng)

2012-06-19 14:17:25

PC計(jì)算

2022-07-14 08:02:57

Netty網(wǎng)絡(luò)模塊

2021-05-14 00:00:15

JavaScript開發(fā)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久视频免费看| 韩国视频一区二区三区| 色哟哟中文字幕| 国产色综合网| 国产亚洲视频在线观看| 激情五月俺来也| av软件在线观看| www.成人网.com| 国产精品久久久亚洲| 久久精品在线观看视频| 97se亚洲国产一区二区三区| 天天综合色天天| 亚洲午夜精品久久| 国产香蕉在线观看| 日韩成人一级片| 一区二区三区在线影院| 欧美精品18+| 久久久久亚洲av无码专区喷水| 亚洲精品国产一区二| 日韩精品亚洲一区二区三区免费| 大量国产精品视频| 成人性生交大免费看| 亚洲日本va午夜在线电影| 在线视频观看一区| av免费观看网| 国产一区久久精品| 国产亚洲一本大道中文在线| 51精品国产人成在线观看| 波多野结衣视频在线观看| 亚洲视频免费| 精品中文字幕视频| 精品手机在线视频| 免费成人结看片| 欧美精品一区二区在线播放| 97超碰人人爽| 国产亚洲一区二区手机在线观看| 亚洲一区二区在线视频| 在线视频一区观看| av电影在线观看网址| 91蜜桃免费观看视频| 成人欧美一区二区| 国产熟女一区二区丰满| 麻豆国产欧美日韩综合精品二区| 欧美在线激情视频| 日韩网红少妇无码视频香港| 一区二区三区四区在线观看国产日韩| 深夜精品寂寞黄网站在线观看| 中文精品在线观看| 加勒比色老久久爱综合网| 日韩欧美在线不卡| 永久免费黄色片| 电影91久久久| 色老太综合网| 国产精品嫩草99a| 欧美三级华人主播| 免费观看成年在线视频网站| av综合在线播放| 国产精品区一区| 亚洲h视频在线观看| 国产成人精品午夜视频免费| 亚洲一区中文字幕在线观看| 国产美女www爽爽爽视频| 麻豆精品视频在线观看免费| 国产欧美日韩专区发布| 97超视频在线观看| 国精品**一区二区三区在线蜜桃| 国产一区二中文字幕在线看| 一区二区久久精品66国产精品| 老司机午夜精品| 国产欧美日韩最新| 精品国产乱码一区二区三| 国产精品系列在线播放| http;//www.99re视频| 日韩一本精品| 国产视频第一页| 国产91精品露脸国语对白| 草莓视频一区| 天堂中文网在线| 久久夜色精品国产噜噜av | 欧美另类videos| 国产视频一区二区| 一区二区日韩电影| 色综合久久久久无码专区| 午夜影院一区| 欧美视频在线一区二区三区| 亚洲高清在线不卡| aiai久久| 亚洲天堂第二页| 女人18毛片毛片毛片毛片区二| 天天综合精品| 久久久久久国产精品三级玉女聊斋| 日韩三级一区二区三区| 日韩av成人高清| 亚洲一区二区免费在线| 欧美 日韩 国产 成人 在线 91| 91亚洲精品久久久蜜桃| 亚洲视频电影| tube8在线hd| 欧美中文字幕亚洲一区二区va在线 | 欧美综合一区第一页| 中文字幕 人妻熟女| 国产原创一区二区三区| 久久99热只有频精品91密拍| 欧美男女交配视频| 色哟哟在线观看| 国产精品国产三级国产aⅴ原创| 国产小视频免费| 88xx成人免费观看视频库| 日韩一级大片在线观看| 欧美图片一区二区| 亚洲一区在线| 国产极品精品在线观看| 亚洲精品久久久蜜桃动漫 | 国产精品毛片一区二区三区| 国产精品青青在线观看爽香蕉| www.黄色小说.com| 国产亚洲婷婷免费| 无码人妻少妇伦在线电影| 九九九精品视频| 日韩av在线精品| 成人自拍小视频| 久久午夜影视| 国产伦精品一区二区三区四区视频| 香蕉视频免费在线播放| 欧美日韩在线视频首页| 香蕉视频xxxx| 日韩精品看片| 国产国产精品人在线视| 亚洲免费不卡视频| 亚洲欧美日韩国产综合在线| 黄色高清无遮挡| 亚州一区二区| 久久人体大胆视频| 中文字幕一区二区免费| 久久综合色鬼综合色| 免费网站在线观看视频 | 99久久一区三区四区免费| 999在线视频| 色香蕉成人二区免费| 免费日本黄色网址| 极品中文字幕一区| 亚洲一区二区在线| 成人午夜在线影视| 欧美精品xxxxbbbb| 一本一本久久a久久| 日韩电影在线观看一区| 欧美黑人xxxxx| 一区二区三区电影大全| 日韩av影片在线观看| 日本视频www| 蜜桃视频在线入口www| 久久久久久久久97黄色工厂| 久久久亚洲精品无码| 一区二区三区高清在线观看| 欧美www在线| 国产熟女一区二区三区四区| 国产精品美女久久久久久久久| 91看片就是不一样| 国产99亚洲| 国产成人欧美在线观看| 国产在线观看黄| 色综合网色综合| 亚洲性猛交xxxx乱大交| 日韩不卡一区二区三区| 亚洲最大免费| 91精品亚洲一区在线观看| 草民午夜欧美限制a级福利片| 91激情在线观看| 亚洲激情图片qvod| 欧美大喷水吹潮合集在线观看| 亚洲夜间福利| 久久国产精品-国产精品| 日本三级一区| 日韩母乳在线| 欧美精品在线第一页| 老牛影视av牛牛影视av| 欧美日韩视频在线| 成人小视频免费看| 国产一区二区女| 天堂8在线天堂资源bt| 小说区图片区色综合区| 国产精品久久久久久搜索| 老司机在线永久免费观看| 日韩三级电影网址| 欧美三级一区二区三区| 国产精品丝袜在线| 国产精品中文久久久久久| 亚洲麻豆视频| 台湾成人av| 综合激情五月婷婷| 青草热久免费精品视频 | 麻豆一二三区精品蜜桃| 国内精品久久久久久中文字幕| 户外极限露出调教在线视频| 欧美群妇大交群的观看方式| 国产真实乱人偷精品视频| 久久久久久免费网| 日韩av成人网| 日韩精品欧美成人高清一区二区| 久久视频免费在线| 一本久久青青| 99re视频| 国产精品久久亚洲不卡| 欧美成人午夜激情| 国产免费av高清在线| 日韩精品中午字幕| 最近中文字幕在线观看视频| 亚洲成人在线免费| 毛片aaaaaa| 91影院在线免费观看| 日批视频在线看| 日本v片在线高清不卡在线观看| 欧美国产视频一区| 久久麻豆精品| 免费毛片一区二区三区久久久| 精品国产一区二| 国产精品大陆在线观看| 麻豆mv在线观看| 欧美刺激性大交免费视频| 成人性爱视频在线观看| 日韩av在线免费播放| 国产成人av免费看| 欧美日韩一区二区三区四区 | 97人人澡人人爽| 国产原创一区| 国产精品www色诱视频| www.综合网.com| 超在线视频97| 素人av在线| 中文精品99久久国产香蕉| 日韩在线免费看| 亚洲第一区第一页| 狠狠综合久久av一区二区| 在线播放中文字幕一区| 中文字幕在线观看国产| 一本久道久久综合中文字幕| 日本网站在线免费观看| 亚洲一区二区三区精品在线| 欧美黄色aaa| 亚洲色图制服诱惑| 午夜激情福利网| 中文字幕一区二区5566日韩| 懂色av粉嫩av浪潮av| 国产欧美视频在线观看| 白嫩情侣偷拍呻吟刺激 | 久久美女免费视频| 久久夜色精品国产欧美乱极品| wwwxx日本| 成人国产精品视频| 国产草草浮力影院| www.成人网.com| 欧美成人午夜精品免费| 91免费观看视频| 欧美黄色一级生活片| 久久久精品tv| 一级片久久久久| 中文字幕在线不卡一区二区三区| 懂色av蜜臀av粉嫩av永久| 日韩一区欧美一区| 欧美日韩在线观看免费| 亚洲一区二区欧美激情| 日产亚洲一区二区三区| 色综合天天综合在线视频| 五月天婷婷导航| 欧美三级三级三级爽爽爽| 亚洲性在线观看| 日韩欧美色综合| 天堂网2014av| 亚洲深夜福利视频| 免费黄色在线| 色综合视频一区中文字幕| 91九色porn在线资源| 欧美主播福利视频| 狂野欧美性猛交xxxx| 96pao国产成视频永久免费| 超碰精品在线| 奇米精品在线| 亚洲草久电影| 成人性免费视频| 麻豆亚洲精品| 欧美日韩精品区别| 国产成人亚洲精品狼色在线| 无套内谢大学处破女www小说| 国产午夜精品在线观看| 国产高潮国产高潮久久久91| 亚洲第一久久影院| 最新中文字幕免费| 日韩欧美国产电影| 日本高清中文字幕二区在线| 一区二区三区国产视频| 色老头在线观看| 日韩免费高清在线观看| 精品视频一区二区三区在线观看| 国产美女精品在线观看| 日韩三级在线| 国产中文字幕二区| 精品一区二区三区的国产在线播放 | 亚洲欧美日韩国产成人综合一二三区| 午夜片欧美伦| 亚洲色欲综合一区二区三区| 国内不卡的二区三区中文字幕| 成人性生活免费看| 亚洲视频免费在线| 亚洲精品毛片一区二区三区| 精品欧美一区二区三区精品久久| 大乳在线免费观看| 久久久久久久久中文字幕| 国产精品.xx视频.xxtv| 蜜桃av噜噜一区二区三区| 亚洲字幕久久| 欧美性猛交久久久乱大交小说| 国产91丝袜在线18| 免费黄色国产视频| 欧美日韩在线免费观看| 亚洲AV无码乱码国产精品牛牛 | 欧美成人国产精品一区二区| 亚洲欧美日韩久久| 又污又黄的网站| 亚洲深夜福利网站| 国产伦久视频在线观看| 91精品视频在线播放| 北条麻妃国产九九九精品小说| 男人添女人下部高潮视频在观看 | 亚洲av成人片色在线观看高潮| 国产精品剧情在线亚洲| 99精品人妻国产毛片| 亚洲第一二三四五区| 羞羞视频在线观看不卡| 国产日韩一区在线| 国产尤物久久久| 久久久精品在线视频| 99久久精品情趣| 精品午夜福利在线观看| 日韩欧美激情一区| 国产美女在线观看| 国产一区私人高清影院| 日韩一区二区在线免费| 999精品视频在线| 久久久天堂av| 无码人妻精品一区二| 日韩av一区二区在线| 色戒汤唯在线观看| 精品无码久久久久久久动漫| 欧美日韩日本国产亚洲在线| 野花视频免费在线观看| 亚洲男女毛片无遮挡| 99免费在线视频| 欧美成人一二三| 亚洲超碰在线观看| 青青青青在线视频| 成人免费精品视频| 国产福利久久久| 亚洲精品成人久久| 黑森林国产精品av| 久久精品日韩| 日韩精品国产欧美| 国产黄色片在线| 欧美精品vⅰdeose4hd| 1769免费视频在线观看| 国产精品久久久久免费| 日韩亚洲精品在线| 三级黄色片网站| 色屁屁一区二区| 午夜视频成人| 亚洲一区二区三区视频| 激情久久久久| 久久久久久久久免费看无码| 色哟哟国产精品免费观看| av在线第一页| 91免费欧美精品| 中文在线手机av| 日韩国产高清视频在线| 小泽玛利亚一区二区三区视频| 色天天综合狠狠色| 久久精品一级| 亚洲 欧美 日韩 国产综合 在线 | 久久精品视频免费看| 超碰97在线资源| 久久精品亚洲| 五月综合色婷婷| 亚洲成人网久久久| 久久xxx视频| 黄网站色视频免费观看| www久久久久| 亚洲天堂视频网| 午夜精品久久17c| 日韩精品午夜| 国产白袜脚足j棉袜在线观看 | 欧美激情精品久久久久| 日韩电影不卡一区| 日韩欧美国产片| 亚洲国产一二三| av资源网站在线观看| 国产福利久久精品| 日韩电影在线免费看| 国产在线视频你懂的| 中文字幕一区日韩电影| 欧美交a欧美精品喷水| 国产传媒免费观看| 狠狠久久五月精品中文字幕|