日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

理解 JavaScript 闭包

發布時間:2023/12/10 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解 JavaScript 闭包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介 Closure 所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。 閉包是 ECMAScript (JavaScript)最強大的特性之一,但用好閉包的前提是必須理解閉包。閉包的創建相對容易,人們甚至會在不經意間創建閉包,但這些無意創建的閉包卻存在潛在的危害,尤其是在比較常見的瀏覽器環境下。如果想要揚長避短地使用閉包這一特性,則必須了解它們的工作機制。而閉包工作機制的實現很大程度上有賴于標識符(或者說對象屬性)解析過程中作用域的角色。關于閉包,最簡單的描述就是 ECMAScript 允許使用內部函數--即函數定義和函數表達式位于另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。也就是說,內部函數會在外部函數返回后被執行。而當這個內部函數執行時,它仍然必需訪問其外部函數的局部變量、參數以及其他內部函數。這些局部變量、參數和函數聲明(最初時)的值是外部函數返回時的值,但也會受到內部函數的影響。遺憾的是,要適當地理解閉包就必須理解閉包背后運行的機制,以及許多相關的技術細節。雖然本文的前半部分并沒有涉及 ECMA 262 規范指定的某些算法,但仍然有許多無法回避或簡化的內容。對于個別熟悉對象屬性名解析的人來說,可以跳過相關的內容,但是除非你對閉包也非常熟悉,否則最好是不要跳過下面幾節。對象屬性名解析 ECMAScript 認可兩類對象:原生(Native)對象和宿主(Host)對象,其中宿主對象包含一個被稱為內置對象的原生對象的子類(ECMA 262 3rd Ed Section 4.3)。原生對象屬于語言,而宿主對象由環境提供,比如說可能是文檔對象、DOM 等類似的對象。原生對象具有松散和動態的命名屬性(對于某些實現的內置對象子類別而言,動態性是受限的--但這不是太大的問題)。對象的命名屬性用于保存值,該值可以是指向另一個對象(Objects)的引用(在這個意義上說,函數也是對象),也可以是一些基本的數據類型,比如:String、Number、Boolean、Null 或 Undefined。其中比較特殊的是 Undefined 類型,因為可以給對象的屬性指定一個 Undefined 類型的值,而不會刪除對象的相應屬性。而且,該屬性只是保存著 undefined 值。下面簡要介紹一下如何設置和讀取對象的屬性值,并最大程度地體現相應的內部細節。值的賦予 對象的命名屬性可以通過為該命名屬性賦值來創建,或重新賦值。即,對于:var objectRef = new Object(); //創建一個普通的 javascript 對象。 可以通過下面語句來創建名為 “testNumber” 的屬性:objectRef.testNumber = 5; /* - 或- */ objectRef["testNumber"] = 5; 在賦值之前,對象中沒有“testNumber” 屬性,但在賦值后,則創建一個屬性。之后的任何賦值語句都不需要再創建這個屬性,而只會重新設置它的值:objectRef.testNumber = 8; /* - 或- */ objectRef["testNumber"] = 8; 稍后我們會介紹,Javascript 對象都有原型(prototypes)屬性,而這些原型本身也是對象,因而也可以帶有命名的屬性。但是,原型對象命名屬性的作用并不體現在賦值階段。同樣,在將值賦給其命名屬性時,如果對象沒有該屬性則會創建該命名屬性,否則會重設該屬性的值。值的讀取 當讀取對象的屬性值時,原型對象的作用便體現出來。如果對象的原型中包含屬性訪問器(property accessor)所使用的屬性名,那么該屬性的值就會返回:/* 為命名屬性賦值。如果在賦值前對象沒有相應的屬性,那么賦值后就會得到一個:*/ objectRef.testNumber = 8;/* 從屬性中讀取值 */var val = objectRef.testNumber; /* 現在, - val - 中保存著剛賦給對象命名屬性的值 8*/而且,由于所有對象都有原型,而原型本身也是對象,所以原型也可能有原型,這樣就構成了所謂的原型鏈。原型鏈終止于鏈中原型為 null 的對象。Object 構造函數的默認原型就有一個 null 原型,因此:var objectRef = new Object(); //創建一個普通的 JavaScript 對象。 創建了一個原型為 Object.prototype 的對象,而該原型自身則擁有一個值為 null 的原型。也就是說,objectRef 的原型鏈中只包含一個對象-- Object.prototype。但對于下面的代碼而言:/* 創建 - MyObject1 - 類型對象的函數*/ function MyObject1(formalParameter){/* 給創建的對象添加一個名為 - testNumber - 的屬性并將傳遞給構造函數的第一個參數指定為該屬性的值:*/this.testNumber = formalParameter; }/* 創建 - MyObject2 - 類型對象的函數*/ function MyObject2(formalParameter){/* 給創建的對象添加一個名為 - testString - 的屬性并將傳遞給構造函數的第一個參數指定為該屬性的值:*/this.testString = formalParameter; }/* 接下來的操作用 MyObject1 類的實例替換了所有與 MyObject2 類的實例相關聯的原型。而且,為 MyObject1 構造函數傳遞了參數 - 8 - ,因而其 - testNumber - 屬性被賦予該值:*/ MyObject2.prototype = new MyObject1( 8 );/* 最后,將一個字符串作為構造函數的第一個參數, 創建一個 - MyObject2 - 的實例,并將指向該對象的 引用賦給變量 - objectRef - :*/var objectRef = new MyObject2( "String_Value" ); 被變量 objectRef 所引用的 MyObject2 的實例擁有一個原型鏈。該鏈中的第一個對象是在創建后被指定給 MyObject2 構造函數的 prototype 屬性的 MyObject1 的一個實例。MyObject1 的實例也有一個原型,即與 Object.prototype 所引用的對象對應的默認的 Object 對象的原型。最后, Object.prototype 有一個值為 null 的原型,因此這條原型鏈到此結束。當某個屬性訪問器嘗試讀取由 objectRef 所引用的對象的屬性值時,整個原型鏈都會被搜索。在下面這種簡單的情況下:var val = objectRef.testString; 因為 objectRef 所引用的 MyObject2 的實例有一個名為“testString”的屬性,因此被設置為“String_Value”的該屬性的值被賦給了變量 val。但是:var val = objectRef.testNumber; 則不能從 MyObject2 實例自身中讀取到相應的命名屬性值,因為該實例沒有這個屬性。然而,變量 val 的值仍然被設置為 8,而不是未定義--這是因為在該實例中查找相應的命名屬性失敗后,解釋程序會繼續檢查其原型對象。而該實例的原型對象是 MyObject1 的實例,這個實例有一個名為“testNumber”的屬性并且值為 8,所以這個屬性訪問器最后會取得值 8。而且,雖然 MyObject1 和 MyObject2 都沒有定義 toString 方法,但是當屬性訪問器通過 objectRef 讀取 toString 屬性的值時:var val = objectRef.toString; 變量 val 也會被賦予一個函數的引用。這個函數就是在 Object.prototype 的 toString 屬性中所保存的函數。之所以會返回這個函數,是因為發生了搜索objectRef 原型鏈的過程。當在作為對象的 objectRef 中發現沒有“toString”屬性存在時,會搜索其原型對象,而當原型對象中不存在該屬性時,則會繼續搜索原型的原型。而原型鏈中最終的原型是 Object.prototype,這個對象確實有一個 toString 方法,因此該方法的引用被返回。最后:var val = objectRef.madeUpProperty; 返回 undefined,因為在搜索原型鏈的過程中,直至 Object.prototype 的原型--null,都沒有找到任何對象有名為“madeUpPeoperty”的屬性,因此最終返回 undefined。不論是在對象或對象的原型中,讀取命名屬性值的時候只返回首先找到的屬性值。而當為對象的命名屬性賦值時,如果對象自身不存在該屬性則創建相應的屬性。這意味著,如果執行像 objectRef.testNumber = 3 這樣一條賦值語句,那么這個 MyObject2 的實例自身也會創建一個名為“testNumber”的屬性,而之后任何讀取該命名屬性的嘗試都將獲得相同的新值。這時候,屬性訪問器不會再進一步搜索原型鏈,但 MyObject1 實例值為 8 的“testNumber”屬性并沒有被修改。給 objectRef 對象的賦值只是遮擋了其原型鏈中相應的屬性。注意:ECMAScript 為 Object 類型定義了一個內部 [[prototype]] 屬性。這個屬性不能通過腳本直接訪問,但在屬性訪問器解析過程中,則需要用到這個內部 [[prototype]] 屬性所引用的對象鏈--即原型鏈。可以通過一個公共的 prototype 屬性,來對與內部的 [[prototype]] 屬性對應的原型對象進行賦值或定義。這兩者之間的關系在 ECMA 262(3rd edition)中有詳細描述,但超出了本文要討論的范疇。標識符解析、執行環境和作用域鏈 執行環境 執行環境是 ECMAScript 規范(ECMA 262 第 3 版)用于定義 ECMAScript 實現必要行為的一個抽象的概念。對如何實現執行環境,規范沒有作規定。但由于執行環境中包含引用規范所定義結構的相關屬性,因此執行環境中應該保有(甚至實現)帶有屬性的對象--即使屬性不是公共屬性。所有 JavaScript 代碼都是在一個執行環境中被執行的。全局代碼(作為內置的 JS 文件執行的代碼,或者 HTML 頁面加載的代碼)是在我將稱之為“全局執行環境”的執行環境中執行的,而對函數的每次調用(有可能是作為構造函數)同樣有關聯的執行環境。通過 eval 函數執行的代碼也有截然不同的執行環境,但因為 JavaScript 程序員在正常情況下一般不會使用 eval,所以這里不作討論。有關執行環境的詳細說明請參閱 ECMA 262(第 3 版)第 10.2 節。當調用一個 JavaScript 函數時,該函數就會進入相應的執行環境。如果又調用了另外一個函數(或者遞歸地調用同一個函數),則又會創建一個新的執行環境,并且在函數調用期間執行過程都處于該環境中。當調用的函數返回后,執行過程會返回原始執行環境。因而,運行中的 JavaScript 代碼就構成了一個執行環境棧。在創建執行環境的過程中,會按照定義的先后順序完成一系列操作。首先,在一個函數的執行環境中,會創建一個“活動”對象。活動對象是規范中規定的另外一種機制。之所以稱之為對象,是因為它擁有可訪問的命名屬性,但是它又不像正常對象那樣具有原型(至少沒有預定義的原型),而且不能通過 JavaScript 代碼直接引用活動對象。為函數調用創建執行環境的下一步是創建一個 arguments 對象,這是一個類似數組的對象,它以整數索引的數組成員一一對應地保存著調用函數時所傳遞的參數。這個對象也有 length 和 callee 屬性(這兩個屬性與我們討論的內容無關,詳見規范)。然后,會為活動對象創建一個名為“arguments”的屬性,該屬性引用前面創建的 arguments 對象。接著,為執行環境分配作用域。作用域由對象列表(鏈)組成。每個函數對象都有一個內部的 [[scope]] 屬性(該屬性我們稍后會詳細介紹),這個屬性也由對象列表(鏈)組成。指定給一個函數調用執行環境的作用域,由該函數對象的 [[scope]] 屬性所引用的對象列表(鏈)組成,同時,活動對象被添加到該對象列表的頂部(鏈的前端)。之后會發生由 ECMA 262 中所謂“可變”對象完成的“變量實例化”的過程。只不過此時使用活動對象作為可變對象(這里很重要,請注意:它們是同一個對象)。此時會將函數的形式參數創建為可變對象命名屬性,如果調用函數時傳遞的參數與形式參數一致,則將相應參數的值賦給這些命名屬性(否則,會給命名屬性賦 undefined 值)。對于定義的內部函數,會以其聲明時所用名稱為可變對象創建同名屬性,而相應的內部函數則被創建為函數對象并指定給該屬性。變量實例化的最后一步是將在函數內部聲明的所有局部變量創建為可變對象的命名屬性。根據聲明的局部變量創建的可變對象的屬性在變量實例化過程會被賦予 undefined 值。在執行函數體內的代碼、并計算相應的賦值表達式之前不會對局部變量執行真正的實例化。事實上,擁有 arguments 屬性的活動對象和擁有與函數局部變量對應的命名屬性的可變對象是同一個對象。因此,可以將標識符 arguments 作為函數的局部變量來看待。回到頂部 最后,在this可以被使用之前,還必須先對其賦值。如果賦的值是一個對象的引用,則 this.m 訪問的便是該對象上的 m。如果(內部)賦的值是 null,則this就指向全局對象。 (此段由 pangba 劉未鵬 翻譯)(原文備考:Finally a value is assigned for use with the this keyword. If the value assigned refers to an object then property accessors prefixed with the this keyword reference properties of that object. If the value assigned (internally) is null then the this keyword will refer to the global object. )創建全局執行環境的過程會稍有不同,因為它沒有參數,所以不需要通過定義的活動對象來引用這些參數。但全局執行環境也需要一個作用域,而它的作用域鏈實際上只由一個對象--全局對象--組成。全局執行環境也會有變量實例化的過程,它的內部函數就是涉及大部分 JavaScript 代碼的、常規的頂級函數聲明。而且,在變量實例化過程中全局對象就是可變對象,這就是為什么全局性聲明的函數是全局對象屬性的原因。全局性聲明的變量同樣如此。全局執行環境也會使用 this 對象來引用全局對象。作用域鏈與 [[scope]] 調用函數時創建的執行環境會包含一個作用域鏈,這個作用域鏈是通過將該執行環境的活動(可變)對象添加到保存于所調用函數對象的 [[scope]] 屬性中的作用域鏈前端而構成的。所以,理解函數對象內部的 [[scope]] 屬性的定義過程至關重要。在 ECMAScript 中,函數也是對象。函數對象在變量實例化過程中會根據函數聲明來創建,或者是在計算函數表達式或調用 Function 構造函數時創建。通過調用 Function 構造函數創建的函數對象,其內部的 [[scope]] 屬性引用的作用域鏈中始終只包含全局對象。通過函數聲明或函數表達式創建的函數對象,其內部的 [[scope]] 屬性引用的則是創建它們的執行環境的作用域鏈。在最簡單的情況下,比如聲明如下全局函數:-function exampleFunction(formalParameter){... // 函數體內的代碼 } 當為創建全局執行環境而進行變量實例化時,會根據上面的函數聲明創建相應的函數對象。因為全局執行環境的作用域鏈中只包含全局對象,所以它就給自己創建的、并以名為“exampleFunction”的屬性引用的這個函數對象的內部 [[scope]] 屬性,賦予了只包含全局對象的作用域鏈。當在全局環境中計算函數表達式時,也會發生類似的指定作用域鏈的過程:-var exampleFuncRef = function(){... // 函數體代碼 } 在這種情況下,不同的是在全局執行環境的變量實例化過程中,會先為全局對象創建一個命名屬性。而在計算賦值語句之前,暫時不會創建函數對象,也不會將該函數對象的引用指定給全局對象的命名屬性。但是,最終還是會在全局執行環境中創建這個函數對象(當計算函數表達式時。譯者注),而為這個創建的函數對象的 [[scope]] 屬性指定的作用域鏈中仍然只包含全局對象。內部的函數聲明或表達式會導致在包含它們的外部函數的執行環境中創建相應的函數對象,因此這些函數對象的作用域鏈會稍微復雜一些。在下面的代碼中,先定義了一個帶有內部函數聲明的外部函數,然后調用外部函數:function exampleOuterFunction(formalParameter){function exampleInnerFuncitonDec(){... // 內部函數體代碼}... // 其余的外部函數體代碼 }exampleOuterFunction( 5 ); 與外部函數聲明對應的函數對象會在全局執行環境的變量實例化過程中被創建。因此,外部函數對象的 [[scope]] 屬性中會包含一個只有全局對象的“單項目”作用域鏈。當在全局執行環境中調用 exampleOuterFunction 函數時,會為該函數調用創建一個新的執行環境和一個活動(可變)對象。這個新執行環境的作用域就由新的活動對象后跟外部函數對象的 [[scope]] 屬性所引用的作用域鏈(只有全局對象)構成。在新執行環境的變量實例化過程中,會創建一個與內部函數聲明對應的函數對象,而同時會給這個函數對象的 [[scope]] 屬性指定創建該函數對象的執行環境(即新執行環境。譯者注)的作用域值--即一個包含活動對象后跟全局對象的作用域鏈。到目前為止,所有過程都是自動、或者由源代碼的結構所控制的。但我們發現,執行環境的作用域鏈定義了執行環境所創建的函數對象的 [[scope]] 屬性,而函數對象的 [[scope]] 屬性則定義了它的執行環境的作用域(包括相應的活動對象)。不過,ECMAScript 也提供了用于修改作用域鏈 with 語句。with 語句會計算一個表達式,如果該表達式是一個對象,那么就將這個對象添加到當前執行環境的作用域鏈中(在活動<可變>對象之前)。然后,執行 with 語句(它自身也可能是一個語句塊)中的其他語句。之后,又恢復到調用它之前的執行環境的作用域鏈中。with 語句不會影響在變量實例化過程中根據函數聲明創建函數對象。但是,可以在一個 with 語句內部對函數表達式求值:-/* 創建全局變量 - y - 它引用一個對象:- */ var y = {x:5}; // 帶有一個屬性 - x - 的對象直接量 function exampleFuncWith(){var z;/* 將全局對象 - y - 引用的對象添加到作用域鏈的前端:- */with(y){/* 對函數表達式求值,以創建函數對象并將該函數對象的引用指定給局部變量 - z - :- */z = function(){... // 內部函數表達式中的代碼;}}... }/* 執行 - exampleFuncWith - 函數:- */ exampleFuncWith(); 在調用 exampleFuncWith 函數所創建的執行環境中包含一個由其活動對象后跟全局對象構成的作用域鏈。而在執行 with 語句時,又會把全局變量 y 引用的對象添加到這個作用域鏈的前端。在對其中的函數表達式求值的過程中,所創建函數對象的 [[scope]] 屬性與創建它的執行環境的作用域保持一致--即,該屬性會引用一個由對象 y 后跟調用外部函數時所創建執行環境的活動對象,后跟全局對象的作用域鏈。當與 with 語句相關的語句塊執行結束時,執行環境的作用域得以恢復(y 會被移除),但是已經創建的函數對象(z。譯者注)的 [[scope]] 屬性所引用的作用域鏈中位于最前面的仍然是對象 y。標識符解析 標識符是沿作用域鏈逆向解析的。ECMA 262 將 this 歸類為關鍵字而不是標識符,并非不合理。因為解析 this 值時始終要根據使用它的執行環境來判斷,而與作用域鏈無關。標識符解析從作用域鏈中的第一個對象開始。檢查該對象中是否包含與標識符對應的屬性名。因為作用域鏈是一條對象鏈,所以這個檢查過程也會包含相應對象的原型鏈(如果有)。如果沒有在作用域鏈的第一個對象中發現相應的值,解析過程會繼續搜索下一個對象。這樣依次類推直至找到作用域鏈中包含以標識符為屬性名的對象為止,也有可能在作用域鏈的所有對象中都沒有發現該標識符。當基于對象使用屬性訪問器時,也會發生與上面相同的標識符解析過程。當屬性訪問器中有相應的屬性可以替換某個對象時,這個屬性就成為表示該對象的標識符,該對象在作用域鏈中的位置進而被確定。全局對象始終都位于作用域鏈的尾端。因為與函數調用相關的執行環境將會把活動(可變)對象添加到作用域鏈的前端,所以在函數體內使用的標識符會首先檢查自己是否與形式參數、內部函數聲明的名稱或局部變量一致。這些都可以由活動(可變)對象的命名屬性來確定。閉包 自動垃圾收集 ECMAScript 要求使用自動垃圾收集機制。但規范中并沒有詳細說明相關的細節,而是留給了實現來決定。但據了解,相當一部分實現對它們的垃圾收集操作只賦予了很低的優先級。但是,大致的思想都是相同的,即如果對象不再“可引用(由于不存在對它的引用,使執行代碼無法再訪問到它)”時,該對象就成為垃圾收集的目標。因而,在將來的某個時刻會將這個對象銷毀并將它所占用的一切資源釋放,以便操作系統重新利用。正常情況下,當退出一個執行環境時就會滿足類似的條件。此時,作用域鏈結構中的活動(可變)對象以及在該執行環境中創建的任何對象--包括函數對象,都不再“可引用”,因此將成為垃圾收集的目標。構成閉包 閉包是通過在對一個函數調用的執行環境中返回一個函數對象構成的。比如,在對函數調用的過程中,將一個對內部函數對象的引用指定給另一個對象的屬性。或者,直接將這樣一個(內部)函數對象的引用指定給一個全局變量、或者一個全局性對象的屬性,或者一個作為參數以引用方式傳遞給外部函數的對象。例如:-function exampleClosureForm(arg1, arg2){var localVar = 8;function exampleReturned(innerArg){return ((arg1 + arg2)/(innerArg + localVar));}/* 返回一個定義為 exampleReturned 的內部函數的引用 -:- */return exampleReturned; }var globalVar = exampleClosureForm(2, 4); 這種情況下,在調用外部函數 exampleClosureForm 的執行環境中所創建的函數對象就不會被當作垃圾收集,因為該函數對象被一個全局變量所引用,而且仍然是可以訪問的,甚至可以通過 globalVar(n) 來執行。的確,情況比正常的時候要復雜一些。因為現在這個被變量 globalVar 引用的內部函數對象的 [[scope]] 屬性所引用的作用域鏈中,包含著屬于創建該內部函數對象的執行環境的活動對象(和全局對象)。由于在執行被 globalVar 引用的函數對象時,每次都要把該函數對象的 [[scope]] 屬性所引用的整個作用域鏈添加到創建的(內部函數的)執行環境的作用域中(即此時的作用域中包括:內部執行環境的活動對象、外部執行環境的活動對象、全局對象。譯者注), 所以這個(外部執行環境的)活動對象不會被當作垃圾收集。閉包因此而構成。此時,內部函數對象擁有自由的變量,而位于該函數作用域鏈中的活動(可變)對象則成為與變量綁定的環境。由于活動(可變)對象受限于內部函數對象(現在被 globalVar 變量引用)的 [[scope]] 屬性中作用域鏈的引用,所以活動對象連同它的變量聲明--即屬性的值,都會被保留。而在對內部函數調用的執行環境中進行作用域解析時,將會把與活動(可變)對象的命名屬性一致的標識符作為該對象的屬性來解析。活動對象的這些屬性值即使是在創建它的執行環境退出后,仍然可以被讀取和設置。在上面的例子中,當外部函數返回(退出它的執行環境)時,其活動(可變)對象的變量聲明中記錄了形式參數、內部函數定義以及局部變量的值。arg1 屬性的值為 2,而 arg2 屬性的值為 4,localVar 的值是 8,還有一個 exampleReturned 屬性,它引用由外部函數返回的內部函數對象。(為方便起見,我們將在后面的討論中,稱這個活動<可變>對象為 "ActOuter1")。如果再次調用 exampleClosureForm 函數,如:-var secondGlobalVar = exampleClosureForm(12, 3); - 則會創建一個新的執行環境和一個新的活動對象。而且,會返回一個新的函數對象,該函數對象的 [[scope]] 屬性引用的作用域鏈與前一次不同,因為這一次的作用域鏈中包含著第二個執行環境的活動對象,而這個活動對象的屬性 arg1 值為 12 而屬性 arg2 值為 3。(為方便起見,我們將在后面的討論中,稱這個活動<可變>對象為 "ActOuter2")。通過第二次執行 exampleClosureForm 函數,第二個、也是截然不同的閉包誕生了。通過執行 exampleClosureForm 創建的兩個函數對象分別被指定給了全局變量 globalVar 和 secondGlobalVar,并返回了表達式 ((arg1 + arg2)/(innerArg + localVar))。該表達式對其中的四個標識符應用了不同的操作符。如何確定這些標識符的值是體現閉包價值的關鍵所在。我們來看一看,在執行由 globalVar 引用的函數對象--如 globalVar(2)--時的情形。此時,會創建一個新的執行環境和相應的活動對象(我們將稱之為“ActInner1”),并把該活動對象添加到執行的函數對象的 [[scope]] 屬性所引用的作用域鏈的前端。ActInner1 會帶有一個屬性 innerArg,根據傳遞的形式參數,其值被指定為 2。這個新執行環境的作用域鏈變成: ActInner1->ActOuter1->全局對象.為了返回表達式 ((arg1 + arg2)/(innerArg + localVar)) 的值,要沿著作用域鏈進行標識符解析。表達式中標識符的值將通過依次查找作用域鏈中每個對象(與標識符名稱一致)的屬性來確定。作用域鏈中的第一個對象是 ActInner1,它有一個名為 innerArg 的屬性,值是 2。所有其他三個標識符在 ActOuter1 中都有對應的屬性:arg1 是 2,arg2 是 4 而 localVar 是 8。最后,函數調用返回 ((2 + 2)/(2 + 8))。現在再來看一看由 secondGlobalVar 引用的同一個函數對象的執行情況,比如 secondGlobalVar(5)。我們把這次創建的新執行環境的活動對象稱為 “ActInner2”,相應的作用域鏈就變成了:ActInner2->ActOuter2->全局對象。ActInner2 返回 innerArg 的值 5,而 ActOuter2 分別返回 arg1、arg2 和 localVar 的值 12、3 和 8。函數調用返回的值就是 ((12 + 3)/(5 + 8))。如果再執行一次 secondGlobalVar,則又會有一個新活動對象被添加到作用域鏈的前端,但 ActOuter2 仍然是鏈中的第二個對象,而他的命名屬性會再次用于完成標識符 arg1、arg2 和 localVar 的解析。這就是 ECMAScript 的內部函數獲取、維持和訪問創建他們的執行環境的形式參數、聲明的內部函數以及局部變量的過程。這個過程說明了構成閉包以后,內部的函數對象在其存續過程中,如何維持對這些值的引用、如何對這些值進行讀取的機制。即,創建內部函數對象的執行環境的活動(可變)對象,會保留在該函數對象的 [[scope]] 屬性所引用的作用域鏈中。直到所有對這個內部函數的引用被釋放,這個函數對象才會成為垃圾收集的目標(連同它的作用域鏈中任何不再需要的對象)。內部函數自身也可能有內部函數。在通過函數執行返回內部函數構成閉包以后,相應的閉包自身也可能會返回內部函數從而構成它們自己的閉包。每次作用域鏈嵌套,都會增加由創建內部函數對象的執行環境引發的新活動對象。ECMAScript 規范要求作用域鏈是臨時性的,但對作用域鏈的長度卻沒有加以限制。在具體實現中,可能會存在實際的限制,但還沒有發現有具體限制數量的報告。目前來看,嵌套的內部函數所擁有的潛能,仍然超出了使用它們的人的想像能力。通過閉包可以做什么? 對這個問題的回答可能會令你驚訝--閉包什么都可以做。據我所知,閉包使得 ECMAScript 能夠模仿任何事物,因此局限性在于設計和實現要模仿事物的能力。只是從字面上看可能會覺得這么說很深奧,下面我們就來看一些更有實際意義的例子。例 1:為函數引用設置延時 閉包的一個常見用法是在執行函數之前為要執行的函數提供參數。例如:將函數作為 setTimout 函數的第一個參數,這在 Web 瀏覽器的環境下是非常常見的一種應用。setTimeout 用于有計劃地執行一個函數(或者一串 JavaScript 代碼,不是在本例中),要執行的函數是其第一個參數,其第二個參數是以毫秒表示的執行間隔。也就是說,當在一段代碼中使用 setTimeout 時,要將一個函數的引用作為它的第一個參數,而將以毫秒表示的時間值作為第二個參數。但是,傳遞函數引用的同時無法為計劃執行的函數提供參數。然而,可以在代碼中調用另外一個函數,由它返回一個對內部函數的引用,再把這個對內部函數對象的引用傳遞給 setTimeout 函數。執行這個內部函數時要使用的參數在調用返回它的外部函數時傳遞。這樣,setTimeout 在執行這個內部函數時,不用傳遞參數,但該內部函數仍然能夠訪問在調用返回它的外部函數時傳遞的參數:function callLater(paramA, paramB, paramC){/* 返回一個由函數表達式創建的匿名內部函數的引用:- */return (function(){/* 這個內部函數將通過 - setTimeout - 執行,而且當它執行時它會讀取并按照傳遞給外部函數的參數行事:*/paramA[paramB] = paramC;}); }.../* 調用這個函數將返回一個在其執行環境中創建的內部函數對象的引用。傳遞的參數最終將作為外部函數的參數被內部函數使用。返回的對內部函數的引用被賦給一個全局變量:- */var functRef = callLater(elStyle, "display", "none"); /* 調用 setTimeout 函數,將賦給變量 - functRef - 的內部函數的引用作為傳遞的第一個參數:- */ hideMenu=setTimeout(functRef, 500); 例 2: 通過對象實例方法關聯函數 回到頂部 許多時候我們需要將一個函數對象暫時掛到一個引用上留待后面執行,因為不等到執行的時候是很難知道其具體參數的,而先前將它賦給那個引用的時候更是壓根不知道的。 (此段由 pangba 劉未鵬 翻譯)(luyy朋友的翻譯_2008-7-7更新)很多時候需要將一個函數引用進行賦值,以便在將來某個時候執行該函數,在執行這些函數時給函數提供參數將會是有用處的,但這些參數在執行時不容易獲得,他們只有在上面賦值給時才能確定。(原文備考:There are many other circumstances when a reference to a function object is assigned so that it would be executed at some future time where it is useful to provide parameters for the execution of that function that would not be easily available at the time of execution but cannot be known until the moment of assignment.)一個相關的例子是,用 JavaScript 對象來封裝與特定 DOM 元素的交互。這個 JavaScript 對象具有 doOnClick、doMouseOver 和 doMouseOut 方法,并且當用戶在該特定的 DOM 元素中觸發了相應的事件時要執行這些方法。不過,可能會創建與不同的 DOM 元素關聯的任意數量的 JavaScript 對象,而且每個對象實例并不知道實例化它們的代碼將會如何操縱它們(即注冊事件處理函數與定義相應的事件處理函數分離。譯者注)。這些對象實例并不知道如何在全局環境中引用它們自身,因為它們不知道將會指定哪個全局變量(如果有)引用它們的實例。因而問題可以歸結為執行一個與特定的 JavaScript 對象關聯的事件處理函數,并且要知道調用該對象的哪個方法。下面這個例子使用了一個基于閉包構建的一般化的函數(此句多謝未鵬指點),該函數會將對象實例與 DOM 元素事件關聯起來,安排執行事件處理程序時調用對象實例的指定方法,給象的指定方法傳遞的參數是事件對象和與元素關聯的引用,該函數返回執行相應方法后的返回值。/* 一個關聯對象實例和事件處理器的函數。 它返回的內部函數被用作事件處理器。對象實例以 - obj - 參數表示, 而在該對象實例中調用的方法名則以 - methodName - (字符串)參數表示。 */ function associateObjWithEvent(obj, methodName){/* 下面這個返回的內部函數將作為一個 DOM 元素的事件處理器*/ return (function(e){/* 在支持標準 DOM 規范的瀏覽器中,事件對象會被解析為參數 - e - , 若沒有正常解析,則使用 IE 的事件對象來規范化事件對象。 */ e = e||window.event;/* 事件處理器通過保存在字符串 - methodName - 中的方法名調用了對象 - obj - 的一個方法。并傳遞已經規范化的事件對象和觸發事件處理器的元素 的引用 - this - (之所以 this 有效是因為這個內部函數是作為該元素的方法執行的) */ return obj[methodName](e, this);}); }/* 這個構造函數用于創建將自身與 DOM 元素關聯的對象, DOM 元素的 ID 作為構造函數的字符串參數。 所創建的對象會在相應的元素觸發 onclick、 onmouseover 或 onmouseout 事件時, 調用相應的方法。 */ function DhtmlObject(elementId){/* 調用一個返回 DOM 元素(如果沒找到返回 null)引用的函數, 必需的參數是 ID。 將返回的值賦給局部變量 - el -。 */ var el = getElementWithId(elementId);/* - el - 值會在內部通過類型轉換變為布爾值,以便 - if - 語句加以判斷。 因此,如果它引用一個對象結果將返回 true,如果是 null 則返回 false。 下面的代碼塊只有當 - el - 變量返回一個 DOM 元素時才會被執行。 */if(el){/* 為給元素的事件處理器指定一個函數,該對象調用了 - associateObjWithEvent - 函數。 同時對象將自身(通過 - this - 關鍵字)作為調用方法的對象, 并提供了調用的方法名稱。 - associateObjWithEvent - 函數會返回 一個內部函數,該內部函數被指定為 DOM 元素的事件處理器。 在響應事件時,執行這個內部函數就會調用必要的方法。 */el.onclick = associateObjWithEvent(this, "doOnClick");el.onmouseover = associateObjWithEvent(this, "doMouseOver");el.onmouseout = associateObjWithEvent(this, "doMouseOut");...} } DhtmlObject.prototype.doOnClick = function(event, element){... // doOnClick 方法體。. } DhtmlObject.prototype.doMouseOver = function(event, element){... // doMouseOver 方法體。 } DhtmlObject.prototype.doMouseOut = function(event, element){... // doMouseOut 方法體。 } 這樣,DhtmlObject 的任何實例都會將自身與相應的 DOM 元素關聯起來,而這些 DOM 元素不必知道其他代碼如何操縱它們(即當觸發相應事件時,會執行什么代碼。譯者注),也不必理會全局命名空間的影響以及與 DhtmlObject 的其他實例間存在沖突的危險。例 3:包裝相關的功能 閉包可以用于創建額外的作用域,通過該作用域可以將相關的和具有依賴性的代碼組織起來,以便將意外交互的風險降到最低。假設有一個用于構建字符串的函數,為了避免重復性的連接操作(和創建眾多的中間字符串),我們的愿望是使用一個數組按順序來存儲字符串的各個部分,然后再使用 Array.prototype.join 方法(以空字符串作為其參數)輸出結果。這個數組將作為輸出的緩沖器,但是將數組作為函數的局部變量又會導致在每次調用函數時都重新創建一個新數組,這在每次調用函數時只重新指定數組中的可變內容的情況下并不是必要的。一種解決方案是將這個數組聲明為全局變量,這樣就可以重用這個數組,而不必每次都建立新數組。但這個方案的結果是,除了引用函數的全局變量會使用這個緩沖數組外,還會多出一個全局屬性引用數組自身。如此不僅使代碼變得不容易管理,而且,如果要在其他地方使用這個數組時,開發者必須要再次定義函數和數組。這樣一來,也使得代碼不容易與其他代碼整合,因為此時不僅要保證所使用的函數名在全局命名空間中是唯一的,而且還要保證函數所依賴的數組在全局命名空間中也必須是唯一的。而通過閉包可以使作為緩沖器的數組與依賴它的函數關聯起來(優雅地打包),同時也能夠維持在全局命名空間外指定的緩沖數組的屬性名,免除了名稱沖突和意外交互的危險。其中的關鍵技巧在于通過執行一個單行(in-line)函數表達式創建一個額外的執行環境,而將該函數表達式返回的內部函數作為在外部代碼中使用的函數。此時,緩沖數組被定義為函數表達式的一個局部變量。這個函數表達式只需執行一次,而數組也只需創建一次,就可以供依賴它的函數重復使用。下面的代碼定義了一個函數,這個函數用于返回一個 HTML 字符串,其中大部分內容都是常量,但這些常量字符序列中需要穿插一些可變的信息,而可變的信息由調用函數時傳遞的參數提供。通過執行單行函數表達式返回一個內部函數,并將返回的函數賦給一個全局變量,因此這個函數也可以稱為全局函數。而緩沖數組被定義為外部函數表達式的一個局部變量。它不會暴露在全局命名空間中,而且無論什么時候調用依賴它的函數都不需要重新創建這個數組。/* 聲明一個全局變量 - getImgInPositionedDivHtml - 并將一次調用一個外部函數表達式返回的內部函數賦給它。這個內部函數會返回一個用于表示絕對定位的 DIV 元素包圍著一個 IMG 元素 的 HTML 字符串,這樣一來,所有可變的屬性值都由調用該函數時的參數提供: */ var getImgInPositionedDivHtml = (function(){/* 外部函數表達式的局部變量 - buffAr - 保存著緩沖數組。這個數組只會被創建一次,生成的數組實例對內部函數而言永遠是可用的因此,可供每次調用這個內部函數時使用。其中的空字符串用作數據占位符,相應的數據將由內部函數插入到這個數組中:*/var buffAr = ['<div id="','', //index 1, DIV ID 屬性'" style="position:absolute;top:','', //index 3, DIV 頂部位置'px;left:','', //index 5, DIV 左端位置'px;width:','', //index 7, DIV 寬度'px;height:','', //index 9, DIV 高度'px;overflow:hidden;\"><img src=\"','', //index 11, IMG URL'\" width=\"','', //index 13, IMG 寬度'\" height=\"','', //index 15, IMG 調蓄'\" alt=\"','', //index 17, IMG alt 文本內容'\"><\/div>'];/* 返回作為對函數表達式求值后結果的內部函數對象。這個內部函數就是每次調用執行的函數- getImgInPositionedDivHtml( ... ) -*/return (function(url, id, width, height, top, left, altText){/* 將不同的參數插入到緩沖數組相應的位置:*/buffAr[1] = id;buffAr[3] = top;buffAr[5] = left;buffAr[13] = (buffAr[7] = width);buffAr[15] = (buffAr[9] = height);buffAr[11] = url;buffAr[17] = altText;/* 返回通過使用空字符串(相當于將數組元素連接起來)連接數組每個元素后形成的字符串:*/return buffAr.join('');}); //:內部函數表達式結束。 })(); /*^^- :單行外部函數表達式。*/ 如果一個函數依賴于另一(或多)個其他函數,而其他函數又沒有必要被其他代碼直接調用,那么可以運用相同的技術來包裝這些函數,而通過一個公開暴露的函數來調用它們。這樣,就將一個復雜的多函數處理過程封裝成了一個具有移植性的代碼單元。其他例子 有關閉包的一個可能是最廣為人知的應用是 Douglas Crockford's technique for the emulation of private instance variables in ECMAScript objects。這種應用方式可以擴展到各種嵌套包含的可訪問性(或可見性)的作用域結構,包括 the emulation of private static members for ECMAScript objects。閉包可能的用途是無限的,可能理解其工作原理才是把握如何使用它的最好指南。意外的閉包 在創建可訪問的內部函數的函數體之外解析該內部函數就會構成閉包。這表明閉包很容易創建,但這樣一來可能會導致一種結果,即沒有認識到閉包是一種語言特性的 JavaScript 作者,會按照內部函數能完成多種任務的想法來使用內部函數。但他們對使用內部函數的結果并不明了,而且根本意識不到創建了閉包,或者那樣做意味著什么。正如下一節談到 IE 中內存泄漏問題時所提及的,意外創建的閉包可能導致嚴重的負面效應,而且也會影響到代碼的性能。問題不在于閉包本身,如果能夠真正做到謹慎地使用它們,反而會有助于創建高效的代碼。換句話說,使用內部函數會影響到效率。使用內部函數最常見的一種情況就是將其作為 DOM 元素的事件處理器。例如,下面的代碼用于向一個鏈接元素添加 onclick 事件處理器:/* 定義一個全局變量,通過下面的函數將它的值作為查詢字符串的一部分添加到鏈接的 - href - 中: */ var quantaty = 5; /* 當給這個函數傳遞一個鏈接(作為函數中的參數 - linkRef -)時,會將一個 onclick 事件處理器指定給該鏈接,該事件處理器將全局變量 - quantaty - 的值作為字符串添加到鏈接的 - href - 屬性中,然后返回 true 使該鏈接在單擊后定位到由 - href - 屬性包含的查詢字符串指定的資源: */ function addGlobalQueryOnClick(linkRef){/* 如果可以將參數 - linkRef - 通過類型轉換為 ture(說明它引用了一個對象):*/if(linkRef){/* 對一個函數表達式求值,并將對該函數對象的引用指定給這個鏈接元素的 onclick 事件處理器:*/linkRef.onclick = function(){/* 這個內部函數表達式將查詢字符串添加到附加事件處理器的元素的 - href - 屬性中:*/this.href += ('?quantaty='+escape(quantaty));return true;};} } 無論什么時候調用 addGlobalQueryOnClick 函數,都會創建一個新的內部函數(通過賦值構成了閉包)。從效率的角度上看,如果只是調用一兩次 addGlobalQueryOnClick 函數并沒有什么大的妨礙,但如果頻繁使用該函數,就會導致創建許多截然不同的函數對象(每對內部函數表達式求一次值,就會產生一個新的函數對象)。上面例子中的代碼沒有關注內部函數在創建它的函數外部可以訪問(或者說構成了閉包)這一事實。實際上,同樣的效果可以通過另一種方式來完成。即單獨地定義一個用于事件處理器的函數,然后將該函數的引用指定給元素的事件處理屬性。這樣,只需創建一個函數對象,而所有使用相同事件處理器的元素都可以共享對這個函數的引用:/* 定義一個全局變量,通過下面的函數將它的值作為查詢字符串的一部分添加到鏈接的 - href - 中: */ var quantaty = 5;/* 當把一個鏈接(作為函數中的參數 - linkRef -)傳遞給這個函數時,會給這個鏈接添加一個 onclick 事件處理器,該事件處理器會將全局變量 - quantaty - 的值作為查詢字符串的一部分添加到鏈接的 - href - 中,然后返回 true,以便單擊鏈接時定位到由作為 - href - 屬性值的查詢字符串所指定的資源: */ function addGlobalQueryOnClick(linkRef){/* 如果 - linkRef - 參數能夠通過類型轉換為 true(說明它引用了一個對象):*/if(linkRef){/* 將一個對全局函數的引用指定給這個鏈接的事件處理屬性,使函數成為鏈接元素的事件處理器:*/linkRef.onclick = forAddQueryOnClick;} } /* 聲明一個全局函數,作為鏈接元素的事件處理器,這個函數將一個全局變量的值作為要添加事件處理器的鏈接元素的 - href - 值的一部分: */ function forAddQueryOnClick(){this.href += ('?quantaty='+escape(quantaty));return true; } 在上面例子的第一個版本中,內部函數并沒有作為閉包發揮應有的作用。在那種情況下,反而是不使用閉包更有效率,因為不用重復創建許多本質上相同的函數對象。類似地考量同樣適用于對象的構造函數。與下面代碼中的構造函數框架類似的代碼并不罕見:function ExampleConst(param){/* 通過對函數表達式求值創建對象的方法,并將求值所得的函數對象的引用賦給要創建對象的屬性:*/this.method1 = function(){... // 方法體。};this.method2 = function(){... // 方法體。};this.method3 = function(){... // 方法體。};/* 把構造函數的參數賦給對象的一個屬性:*/this.publicProp = param; } 每當通過 new ExampleConst(n) 使用這個構造函數創建一個對象時,都會創建一組新的、作為對象方法的函數對象。因此,創建的對象實例越多,相應的函數對象也就越多。Douglas Crockford 提出的模仿 JavaScript 對象私有成員的技術,就利用了將對內部函數的引用指定給在構造函數中構造對象的公共屬性而形成的閉包。如果對象的方法沒有利用在構造函數中形成的閉包,那么在實例化每個對象時創建的多個函數對象,會使實例化過程變慢,而且將有更多的資源被占用,以滿足創建更多函數對象的需要。這那種情況下,只創建一次函數對象,并把它們指定給構造函數 prototype 的相應屬性顯然更有效率。這樣一來,它們就能被構造函數創建的所有對象共享了:function ExampleConst(param){/* 將構造函數的參數賦給對象的一個屬性:*/this.publicProp = param; } /* 通過對函數表達式求值,并將結果函數對象的引用指定給構造函數原型的相應屬性來創建對象的方法: */ ExampleConst.prototype.method1 = function(){... // 方法體。 }; ExampleConst.prototype.method2 = function(){... // 方法體。 }; ExampleConst.prototype.method3 = function(){... // 方法體。 };Internet Explorer 的內存泄漏問題 Internet Explorer Web 瀏覽器(在 IE 4 到 IE 6 中核實)的垃圾收集系統中存在一個問題,即如果 ECMAScript 和某些宿主對象構成了 "循環引用",那么這些對象將不會被當作垃圾收集。此時所謂的宿主對象指的是任何 DOM 節點(包括 document 對象及其后代元素)和 ActiveX 對象。如果在一個循環引用中包含了一或多個這樣的對象,那么這些對象直到瀏覽器關閉都不會被釋放,而它們所占用的內存同樣在瀏覽器關閉之前都不會交回系統重用。當兩個或多個對象以首尾相連的方式相互引用時,就構成了循環引用。比如對象 1 的一個屬性引用了對象 2 ,對象 2 的一個屬性引用了對象 3,而對象 3 的一個屬性又引用了對象 1。對于純粹的 ECMAScript 對象而言,只要沒有其他對象引用對象 1、2、3,也就是說它們只是相互之間的引用,那么仍然會被垃圾收集系統識別并處理。但是,在 Internet Explorer 中,如果循環引用中的任何對象是 DOM 節點或者 ActiveX 對象,垃圾收集系統則不會發現它們之間的循環關系與系統中的其他對象是隔離的并釋放它們。最終它們將被保留在內存中,直到瀏覽器關閉。閉包非常容易構成循環引用。如果一個構成閉包的函數對象被指定給,比如一個 DOM 節點的事件處理器,而對該節點的引用又被指定給函數對象作用域中的一個活動(或可變)對象,那么就存在一個循環引用。DOM_Node.onevent ->function_object.[[scope]] ->scope_chain ->Activation_object.nodeRef ->DOM_Node。形成這樣一個循環引用是輕而易舉的,而且稍微瀏覽一下包含類似循環引用代碼的網站(通常會出現在網站的每個頁面中),就會消耗大量(甚至全部)系統內存。多加注意可以避免形成循環引用,而在無法避免時,也可以使用補償的方法,比如使用 IE 的 onunload 事件來來清空(null)事件處理函數的引用。時刻意識到這個問題并理解閉包的工作機制是在 IE 中避免此類問題的關鍵。comp.lang.javascript FAQ notes T.O.C.撰稿 Richard Cornford,2004 年 3 月 修改建議來自:

轉載于:https://www.cnblogs.com/oneroom/archive/2010/11/20/closure.html

總結

以上是生活随笔為你收集整理的理解 JavaScript 闭包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

456免费视频| 一本一本久久a久久精品综合 | 欧美日韩国产免费视频 | 一本到在线| 国产精品黄 | 天天干天天操天天爱 | 亚洲人成免费网站 | 在线看国产日韩 | 蜜桃视频精品 | 亚洲欧洲久久久 | 免费av的网站 | 你操综合 | 人人射人人插 | 最新国产精品拍自在线播放 | 国产成人亚洲精品自产在线 | 91av视频| 精品国产乱码久久久久 | 中文乱码视频在线观看 | 国产一区二区久久久久 | 2019中文字幕第一页 | 在线蜜桃视频 | av高清免费在线 | 国产99区 | 91在线看视频 | 国产精品麻豆视频 | 国产一级不卡毛片 | 成年人在线观看视频免费 | 国产精品美乳一区二区免费 | 亚洲欧美综合精品久久成人 | 国产在线欧美日韩 | 亚洲二区精品 | 欧美久久综合 | 992tv人人草 黄色国产区 | 日韩视频一区二区三区在线播放免费观看 | 婷婷精品国产欧美精品亚洲人人爽 | 欧美日韩国产免费视频 | 日韩免费高清 | 亚洲黄色片在线 | 九九欧美 | 在线观看久久久久久 | 黄色一级大片在线免费看产 | 精品天堂av | 色婷婷成人网 | 狠狠地日| 欧美精品在线观看一区 | 国产最新视频在线观看 | 欧美日韩99| 久久久国产精品成人免费 | 黄在线 | 欧美欧美 | 超碰免费av | 成人av一区二区三区 | 亚洲欧美成人网 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产美女被啪进深处喷白浆视频 | 成人中文字幕在线观看 | 日本在线精品视频 | 永久免费的啪啪网站免费观看浪潮 | 操操操影院 | 91亚洲精品国偷拍自产在线观看 | av电影在线观看完整版一区二区 | 久久久久 免费视频 | 色综合天天色综合 | 久99久精品 | 91九色最新地址 | 国产精品日韩欧美一区二区 | 最新av免费| 国产精品18久久久久久久网站 | 国产精品18久久久久vr手机版特色 | 天天天天色射综合 | 色94色欧美 | 亚洲色图激情文学 | 亚洲一区二区高潮无套美女 | 国产精品专区h在线观看 | 亚洲精品视频在 | 91免费看片黄 | 嫩草av在线 | 999久久a精品合区久久久 | 久久人人做 | 免费三级骚 | 久久精品99国产精品 | 日韩精品中文字幕在线 | 蜜桃视频成人在线观看 | 国产精品正在播放 | av片在线观看免费 | 免费成人黄色 | 国产精品18毛片一区二区 | 色综合久久天天 | 国产一区二区在线观看免费 | 色婷婷视频网 | 在线观看91精品视频 | 在线精品视频在线观看高清 | 狠狠狠色丁香婷婷综合久久五月 | 综合久久五月天 | 久久再线视频 | 欧美日本在线观看视频 | 久久成人精品电影 | 永久中文字幕 | 成人精品一区二区三区电影免费 | 超碰在线最新地址 | 久久免费视频这里只有精品 | 不卡av在线 | 在线小视频 | 中文字幕在线观看视频一区二区三区 | 99精品视频在线观看视频 | 国产色婷婷精品综合在线手机播放 | 午夜12点 | av永久网址 | 国产精品久久久久久久久久白浆 | 一区二区成人国产精品 | 精品视频免费播放 | 91天堂素人约啪 | 天堂av色婷婷一区二区三区 | 激情欧美丁香 | 999久久久| 成人国产精品免费 | 国产裸体bbb视频 | 九色91福利| 国产99久久久国产精品免费看 | 日韩中文字幕国产 | 一级α片免费看 | 国产艹b视频| 国产欧美日韩视频 | 91麻豆精品国产自产在线 | 亚洲综合五月天 | 日本精品久久久久 | 在线观看播放av | 二区中文字幕 | 日日躁夜夜躁aaaaxxxx | 九9热这里真品2 | 91久久精| 99亚洲精品| 国产又粗又猛又黄又爽 | 91中文在线视频 | 国产精品久久久亚洲 | 高清一区二区三区av | 日本免费久久高清视频 | 亚洲精品午夜aaa久久久 | 精品久久久免费视频 | 国产精品久久久久aaaa | 在线黄色国产电影 | 黄色成人av在线 | 欧美色综合久久 | 免费观看性生活大片 | 香蕉久久久久久av成人 | 丁香五月网久久综合 | 国产视频 久久久 | 美女网站在线观看 | 狠狠久久综合 | 国产亚洲综合在线 | www.色婷婷.com | 婷婷五天天在线视频 | 久草在线免 | 亚洲激情网站免费观看 | 色九色| 日韩最新av在线 | 日韩精品一区二区在线观看视频 | 国产精品免费在线视频 | 伊人色**天天综合婷婷 | 精品你懂的 | av一级久久| 狠狠色综合网站久久久久久久 | 五月婷婷深开心 | 亚洲精品小视频 | 中文字幕国产一区 | 中文字幕丝袜制服 | 91久久精品一区二区二区 | 国产色中涩| 欧美视频www| 99视频一区 | 狠狠干中文字幕 | 特级西西444www大精品视频免费看 | 日韩精品中字 | 伊人导航| 操操操天天操 | 亚洲国产资源 | 亚洲欧洲美洲av | 韩国av在线播放 | 国产免码va在线观看免费 | www.黄色网.com | 手机av看片 | 在线观看精品视频 | 一区二区成人国产精品 | 欧美精品久久久久久 | 久久久久久毛片 | 国产精品av免费在线观看 | 欧美日韩精品影院 | www.91成人| 日韩手机在线 | 亚洲精品色 | 欧美日韩高清在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 免费视频99 | 在线视频麻豆 | 婷婷色影院| 久热爱| 在线视频欧美日韩 | 三级av中文字幕 | 免费成人短视频 | 欧美日韩在线观看视频 | 久艹在线免费观看 | 97国产 | 国产黄色片网站 | 黄色网址av| 欧美狠狠色 | 在线视频成人 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | a视频免费在线观看 | 国产精品国产三级国产aⅴ入口 | 97视频免费播放 | 毛片视频网址 | 二区视频在线观看 | 91精品91 | 91超在线 | 久草在在线视频 | 国产精品一二三 | 少妇搡bbbb搡bbb搡69 | 91精品啪在线观看国产线免费 | 中文字幕视频网站 | 夜色成人网 | 久久永久免费视频 | 久久久久亚洲精品成人网小说 | 欧美日本高清视频 | 91天堂影院| 久久精品一区二区三区中文字幕 | 最新日韩视频在线观看 | 精品久久91 | 成人毛片网| 81国产精品久久久久久久久久 | 久久99热国产 | 天天操夜夜操国产精品 | www·22com天天操 | 日韩videos高潮hd | 天天色影院 | 国产日韩精品一区二区三区 | 黄色综合 | 亚洲成人资源网 | 成人国产精品免费观看 | 久久免费视频这里只有精品 | 欧美日韩高清在线 | www.色爱| 五月婷婷六月丁香 | a一片一级 | 99se视频在线观看 | 天天操,夜夜操 | 国产精品夜夜夜一区二区三区尤 | 韩国av不卡 | 久久少妇免费视频 | 午夜久久久精品 | 一区二区三区韩国免费中文网站 | 婷香五月 | 国产精品成人久久久久久久 | 国产精品久久免费看 | 在线视频麻豆 | 香蕉免费在线 | 日韩专区一区二区 | 国产精品96久久久久久吹潮 | 中文字幕乱码一区二区 | 国产精品videoxxxx | 日韩精品一区二区三区在线播放 | www.xxxx变态.com| 欧美性护士 | 奇米影视777影音先锋 | 国产九九热视频 | 国产亚洲视频中文字幕视频 | 亚洲一区二区三区精品在线观看 | 麻豆传媒精品 | 午夜精品久久久久久久99 | 在线v片免费观看视频 | 国产婷婷视频在线 | 91在线视频播放 | 九七视频在线观看 | 日韩在线不卡视频 | 国产成人精品免高潮在线观看 | 久久久久99精品国产片 | 九九热在线精品视频 | 久久精品3 | a久久久久久 | 天堂在线免费视频 | 国产视频一区在线 | 久久99热精品 | 麻豆成人精品视频 | 叶爱av在线 | 欧美日韩免费一区二区三区 | 午夜精品久久久久久久99婷婷 | 亚洲欧美色婷婷 | 久久免费看 | 精品国产免费人成在线观看 | 美女国产网站 | 国产成人一级电影 | 亚州精品一二三区 | 狠狠五月天| 久久手机在线视频 | 日韩免费视频观看 | 亚洲精品视频免费在线观看 | 亚洲影院色 | 中文字幕在线成人 | 中文字幕中文字幕在线中文字幕三区 | 成人性生活大片 | 麻豆精品国产传媒 | 黄色小网站免费看 | 深夜免费福利 | 亚洲精品久久久蜜桃 | 麻豆国产精品永久免费视频 | 久久免费电影网 | 日韩在观看线 | 国产香蕉在线 | 在线看国产一区 | 成人免费网站视频 | 在线免费观看涩涩 | av片子在线观看 | 91在线91 | 日韩在线视频线视频免费网站 | 日韩亚洲在线视频 | 亚洲精品无 | 日韩av成人在线观看 | 中文久草 | 日韩av影片在线观看 | 视频99爱 | 天天看天天操 | 精品国产乱码久久久久久1区二区 | 免费日韩精品 | 国产免费中文字幕 | 在线91色| 色七七亚洲影院 | 国产精品毛片完整版 | 奇米影视999 | 久久久精品 一区二区三区 国产99视频在线观看 | 青青草国产精品视频 | 国产在线观看高清视频 | 国产伦理久久精品久久久久_ | 久久免费视频在线观看 | 精品久久久久国产 | 国产又粗又长的视频 | 中国一级片在线观看 | 黄色网址a | 91探花在线 | 中文字幕91在线 | 黄色日视频 | 国内小视频 | 中文字幕永久免费 | 精品一区免费 | 久久免费视频8 | 国产一线在线 | 色综合综合 | 天天爱天天操天天爽 | 中文字幕av日韩 | 天天·日日日干 | 色偷偷网站视频 | 日日爽| 激情综合五月婷婷 | 射射射综合网 | 天天干天天摸 | 欧美乱码精品一区二区 | 波多野结衣综合网 | 免费瑟瑟网站 | 天天操操操操操 | 5月丁香婷婷综合 | 成人av一区二区在线观看 | 九色视频自拍 | 欧美成人久久 | 国产精品一区二区三区在线 | 亚洲视频999 | 特级毛片网站 | 在线你懂的视频 | 亚洲成av人影院 | 黄色免费在线视频 | 亚洲伦理精品 | 久久久国产精品人人片99精片欧美一 | 日韩免 | 97超碰色偷偷 | 日韩欧美aaa | 欧美成人精品三级在线观看播放 | 中文字幕综合在线 | 五月天伊人| 久久天天躁狠狠躁夜夜不卡公司 | 久久久午夜精品理论片中文字幕 | 国产精品一区二区精品视频免费看 | av夜夜操| 天堂av在线 | 国产精品乱码一区二区视频 | 国产精品久久婷婷六月丁香 | 国产午夜小视频 | 成年人黄色免费视频 | 国产精品99在线播放 | 美女黄频在线观看 | 91精品视频免费在线观看 | 国产精品网在线观看 | 天天操天天透 | 久久综合久久综合这里只有精品 | 香蕉视频在线免费 | 欧美日韩国产在线 | 婷婷国产一区二区三区 | 97香蕉久久国产在线观看 | 欧美色黄 | 国产精品久久久久久久久毛片 | 色天堂在线视频 | 麻豆视频免费在线播放 | 日韩免费在线看 | 免费看一级 | 成人av免费 | 在线国产观看 | 少妇bbb搡bbbb搡bbbb | 毛片网站观看 | 久久视奸| 久久久久成人免费 | 国产看片免费 | 久久久国产精品电影 | 欧美一级看片 | 国产精品日韩欧美一区二区 | 亚洲精品乱码白浆高清久久久久久 | 国产精品久久久久久久久久 | 国产成人综合图片 | 亚洲精品午夜久久久久久久久久久 | 国产系列 在线观看 | 久久国产免 | 精品国产综合区久久久久久 | 一区二区三区在线免费观看视频 | 亚洲在线a | 国产福利91精品张津瑜 | 丝袜美腿在线播放 | 欧美精品在线视频 | 免费男女羞羞的视频网站中文字幕 | 久久99久久99精品中文字幕 | 久久天堂影院 | 91大神精品视频在线观看 | av7777777 | 探花视频免费在线观看 | 中文字幕欧美日韩va免费视频 | 亚洲成av人片在线观看 | 久久夜色精品国产欧美乱极品 | 久久精品国产免费看久久精品 | 国产免费中文字幕 | 一级黄色片在线免费看 | 超碰97在线资源 | 五月婷婷丁香 | 在线亚洲欧美日韩 | 在线精品在线 | 亚洲精品视频在线观看网站 | 国产黑丝一区二区三区 | 在线视频在线观看 | 日韩精品免费在线 | 久久国产视屏 | 国产在线观看二区 | 亚洲区精品 | 久草在线视频精品 | 一级a性色生活片久久毛片波多野 | 91视频网址入口 | 97精品国产aⅴ | 国产在线免费观看 | 夜夜骑天天操 | 国产精品第2页 | 97人人超碰在线 | 一性一交视频 | 97福利在线观看 | 久久综合九色综合97婷婷女人 | 精品国产美女 | 激情欧美一区二区三区 | 亚洲第五色综合网 | 波多野结衣在线观看视频 | 特级西西444www大精品视频免费看 | 97视频在线播放 | 久久久久久久久久久久99 | 91亚洲精品久久久蜜桃 | 狠狠撸电影 | 美女黄网站视频免费 | 久久一区91| 日韩电影中文字幕在线观看 | 91完整版观看| 日韩免费区 | 免费涩涩网站 | 国产精品不卡在线 | 亚洲国产小视频在线观看 | 精品国产乱码久久 | 日韩性xxx| 狠狠躁18三区二区一区ai明星 | 在线观看av小说 | 中文字幕中文字幕 | 欧美专区国产专区 | 国产最新网站 | 激情综合一区 | 黄色一级影院 | 91在线永久 | 午夜美女福利 | 国产三级在线播放 | 97国产一区二区 | 色综合久久精品 | 香蕉视频免费在线播放 | 色在线免费观看 | 精品在线观看免费 | 国产黄色成人av | 免费a现在观看 | 欧美 亚洲 另类 激情 另类 | 免费看特级毛片 | 黄色软件大全网站 | 91精选在线| 国产视频资源 | 亚洲国产精品一区二区久久,亚洲午夜 | 国产视频久 | 国产在线超碰 | 97香蕉久久超级碰碰高清版 | 国产中文字幕视频 | 成人免费大片黄在线播放 | 国产精品一区二区三区观看 | 波多野结衣一区二区 | 欧美另类亚洲 | a久久久久| 婷婷激情在线 | 日韩三级成人 | 天天干夜夜擦 | 日韩1页| 91传媒在线观看 | 国产成人一区在线 | 99精品视频在线观看视频 | 中文字幕在线看片 | 人人爽久久久噜噜噜电影 | 亚洲爱爱视频 | 蜜桃视频在线观看一区 | 国产精品网站 | 久久天天躁夜夜躁狠狠躁2022 | 欧美精品久久久久久久免费 | 中文字幕有码在线 | 天天干天天搞天天射 | 天天操天天射天天爽 | 国产精品久久久精品 | 国产成人精品一区二区三区福利 | 在线观看黄色的网站 | av在线不卡观看 | 国产一级特黄毛片在线毛片 | 欧美人操人 | 日本中文字幕视频 | 婷婷丁香花 | 日韩高清在线一区二区 | 久久国产经典视频 | 成人一级片免费看 | 国产在线第三页 | 天天曰天天射 | 国产高清日韩欧美 | 久久影视中文字幕 | 香蕉影视 | 国产一级在线播放 | 高清免费av在线 | 国产日韩在线播放 | 久草在线免费色站 | 国产高清不卡 | 欧美一二三专区 | 久久国内视频 | 九九九毛片 | 91免费高清观看 | 91最新在线观看 | 香蕉视频在线看 | www.天天干 | 国产麻豆剧传媒免费观看 | 久久草在线视频国产 | 天天爽天天爽天天爽 | 国产午夜三级一区二区三 | 精品国产一区二区三区男人吃奶 | 日韩av快播电影网 | 国产精品久久一卡二卡 | 激情欧美丁香 | 久久五月婷婷丁香社区 | 亚洲成人资源 | 在线观看v片 | 成人中文字幕在线 | 亚洲作爱视频 | 青青河边草免费视频 | 五月婷婷一区二区三区 | 91专区在线观看 | 欧美日韩精品免费观看视频 | 婷婷丁香导航 | 91看片淫黄大片在线播放 | a黄色片 | 日本精品久久久久 | 久久久久成人免费 | 久久精国产 | 国产一区二区高清 | 成人网444ppp | 成 人 a v天堂 | 在线日韩三级 | www婷婷| 国产一区二区三区久久久 | 日本黄色免费看 | 色噜噜狠狠色综合中国 | 天天操天天谢 | 在线观看成人 | 中文字幕首页 | 色偷偷av男人天堂 | 91亚洲狠狠婷婷综合久久久 | 又黄又爽又色无遮挡免费 | 国产不卡免费视频 | 国产一区二区在线播放视频 | 中文字幕在线看 | 东方av在线免费观看 | 色婷婷天天干 | 国产一区国产二区在线观看 | 91麻豆福利 | 99久久激情 | 超碰人人在线 | 日韩精品不卡在线观看 | 1024久久 | 九九免费观看视频 | 亚洲欧美成人综合 | 亚洲国产精品免费 | 黄色视屏免费在线观看 | 正在播放国产一区 | 一区二区精品久久 | 人人爽人人爽人人片av | 久久韩国免费视频 | 成人久久久精品国产乱码一区二区 | 中文字幕一区二区三区乱码在线 | 欧美一级艳片视频免费观看 | a级片网站| 日本精品va在线观看 | 日韩在线观看一区二区三区 | 久久综合狠狠综合久久狠狠色综合 | 日韩精品中字 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 97免费在线观看视频 | 色网站国产精品 | 九九视频热 | 中文字幕免费成人 | 99视频在线免费看 | 国产成人精品一区一区一区 | 国内精品免费久久影院 | 精品久久91| 日韩电影在线观看中文字幕 | 99久久精品无码一区二区毛片 | 国产一级久久 | 一区二区三区免费在线观看视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 中文国产字幕在线观看 | 丝袜美腿在线视频 | 国内精品久久久久影院优 | 色婷婷导航 | 日韩网站在线 | 国产主播99 | 中文字幕 国产视频 | 狠狠做深爱婷婷综合一区 | 99久久夜色精品国产亚洲 | 91香蕉视频黄色 | 欧美精品久久久久久久亚洲调教 | 日韩专区在线观看 | 99在线热播精品免费99热 | 久久一精品 | 亚洲一本视频 | 国产视频亚洲视频 | 日韩精品一区二区三区视频播放 | 日日夜夜天天人人 | 五月天色站 | 久久久精品网站 | 免费看黄在线 | 99re8这里有精品热视频免费 | 久久免费看a级毛毛片 | 成人影片在线播放 | 91精品在线视频观看 | 一区二区 不卡 | 午夜精品久久久久久久久久 | 97国产大学生情侣酒店的特点 | 99久高清在线观看视频99精品热在线观看视频 | 久久的色 | 特级西西www44高清大胆图片 | 精品国产一区二区三区四 | 午夜av一区二区三区 | 美女网站在线看 | 国产日韩精品一区二区三区 | 亚洲人成影院在线 | 亚洲视屏在线播放 | 中文字幕在线免费观看视频 | 在线观看av麻豆 | 91精品久久久久久久91蜜桃 | 27xxoo无遮挡动态视频 | 人人看人人 | 一级成人免费视频 | 日韩av网页 | 天天操天天干天天操天天干 | 欧美黑人性猛交 | 中文字幕在线日 | 成人在线免费看 | 黄色大全在线观看 | 美女网色 | 国产99久久久久 | 亚洲国产日韩一区 | 日本在线观看中文字幕无线观看 | 中文字幕av最新更新 | 久久理论片 | 国产在线综合视频 | 亚洲综合在线发布 | 午夜手机电影 | 国产毛片aaa| 五月婷婷久 | 国产黄大片在线观看 | 久久露脸国产精品 | 五月花婷婷 | 81精品国产乱码久久久久久 | 尤物97国产精品久久精品国产 | 国产专区欧美专区 | 国产日女人 | 亚洲人成精品久久久久 | 97av视频在线观看 | 精品国产黄色片 | 成年人在线观看视频免费 | 国产99一区视频免费 | 天天操天天添 | 在线国产福利 | 国产色视频网站 | 成人av免费在线播放 | 激情网站| 成人av高清 | 日韩v在线91成人自拍 | 日韩在线观看高清 | 六月色丁香 | 中国美女一级看片 | 美女免费视频一区二区 | 九九热在线观看 | 欧美极品少妇xxxx | 国内精品视频在线播放 | 亚洲精品国产成人 | www国产亚洲精品久久网站 | 亚洲人成在线观看 | 欧美成人h版在线观看 | 伊人天天综合 | 日日激情| 超碰人人国产 | 日韩资源视频 | 国产欧美日韩精品一区二区免费 | 中文字幕国产视频 | 看黄色.com | 中文字幕4| 91九色蝌蚪视频 | 黄色资源在线 | av在线播放中文字幕 | 国产精品一区二区62 | 日韩黄色免费电影 | 91麻豆福利 | 中文字幕国语官网在线视频 | 亚州精品一二三区 | 成人午夜影视 | 国产高清免费在线播放 | 午夜精品一区二区三区四区 | 视频在线播放国产 | 91在线视频免费91 | 有码视频在线观看 | 五月精品 | 成人午夜片av在线看 | 丁香久久久 | 成人毛片100免费观看 | 99久久9| 日韩美一区二区三区 | 欧美激情综合色 | 97精品国产97久久久久久春色 | 97超级碰碰碰视频在线观看 | 婷婷色婷婷 | 国产精品激情偷乱一区二区∴ | 免费裸体视频网 | 欧美日韩国产精品一区二区三区 | 亚洲精品国产精品国产 | 99久久影院| 天操夜夜操 | 精品国产免费av | 精品免费久久久久久 | 青青河边草观看完整版高清 | 亚洲高清视频在线观看免费 | 超碰.com| 欧美精品三级在线观看 | 日韩在线观看小视频 | 91精品国产91久久久久福利 | 欧美日韩国产欧美 | 久久国际影院 | 精品在线免费观看 | 久久久久久久国产精品影院 | 97超在线视频 | 久久专区 | 色综合天 | 欧美激情精品久久久久 | 91视频午夜 | 欧美日韩伦理一区 | 97超碰资源 | 欧美精品乱码久久久久久按摩 | 天天av在线播放 | 亚洲综合在线发布 | 亚洲成人精品在线 | 国产一区二区三区免费在线 | 久久久久久亚洲精品 | 在线免费观看国产精品 | 久久免费资源 | 日韩在线观看一区二区 | 久久免费福利视频 | 97视频免费观看 | 高清中文字幕 | 五月天视频网站 | 亚洲闷骚少妇在线观看网站 | 欧美一区二区三区在线播放 | 成人黄色在线播放 | 久久黄色小说 | 久久亚洲免费视频 | 成人在线观看免费 | 美女精品在线观看 | 成人超碰97 | 久久爱影视i | 91九色综合 | 久久婷婷精品视频 | 日韩aa视频 | 超碰在线99| 国产不卡在线视频 | 国产精品嫩草影院9 | 久久视频免费在线 | 亚洲精品在 | 欧美一区二区三区在线播放 | 久久久精品国产一区二区三区 | 18av在线视频| av丝袜制服| 四虎最新入口 | 免费人成网ww44kk44 | 天天草av| 欧美日韩激情网 | 中文字幕在线播放一区 | 久久视频 | 色a网| 国产小视频在线播放 | 中文字幕 影院 | 亚洲精品视频一二三 | 国产成a人亚洲精v品在线观看 | 国产精品影音先锋 | 久草视频在线资源 | 在线观看成年人 | 日韩精品一区二区三区外面 | 亚洲区另类春色综合小说 | 日韩中文字幕a | 人人干网站 | 99re久久资源最新地址 | 久久免费一级片 | 中文字幕在线观看2018 | 成人国产亚洲 | 精品少妇一区二区三区在线 | 国产亚洲视频在线免费观看 | 国产亚洲一区二区在线观看 | 在线免费观看国产 | 久久激情婷婷 | 国产精品99久久久久久小说 | 日本福利视频在线 | 国产成人久久精品 | 韩国一区二区在线观看 | 亚洲一级黄色大片 | 色视频网站在线观看一=区 a视频免费在线观看 | 在线观看视频在线观看 | 亚洲少妇久久 | 91看成人 | 亚洲人av免费网站 | 91高清免费观看 | 91精彩视频在线观看 | 91黄视频在线 | 日日操日日插 | 99精品久久只有精品 | 亚洲高清在线视频 | 美女视频久久黄 | 日韩欧美综合在线视频 | 在线视频日韩一区 | 精品久久国产 | 国产流白浆高潮在线观看 | 五月开心激情 | 国产精品不卡 | 一区二区三区四区五区在线视频 | 欧美日韩aa| 国产最顶级的黄色片在线免费观看 | 一区在线播放 | 亚洲视频综合 | 在线观看视频在线观看 | 色综合久久久 | 精品国产人成亚洲区 | 日日骑| 911国产精品| 91在线中文字幕 | 亚洲欧洲一区二区在线观看 | se婷婷| 字幕网资源站中文字幕 | 国产午夜精品av一区二区 | 免费在线观看中文字幕 | 国产亚洲婷婷免费 | 免费高清av在线看 | 久久久久免费看 | 日韩欧美黄色网址 | 亚洲伊人成综合网 | 在线观看精品一区 | 久99久视频| 人人干在线 | 亚洲国产片 | 高清一区二区三区av | 在线观看国产www | 天天操天天操天天操天天操天天操天天操 | 国产一区二区三区久久久 | 亚洲视频999 | 国产成人精品免高潮在线观看 | 在线 影视 一区 | 综合在线色 | 国产精品字幕 | 久久免费国产电影 | 香蕉免费在线 | 狂野欧美激情性xxxx欧美 | 在线亚洲午夜片av大片 | 2020天天干天天操 | 欧美一区二区免费在线观看 | 免费观看av网站 | av中文字幕电影 | 国产99久久久国产精品免费看 | 久久影视一区 | 日本久久综合视频 | 国产成人精品一区一区一区 | 久久香蕉影视 | 久久一线 | 日韩免费b | 日韩一区二区三区不卡 | 天天鲁天天干天天射 | 亚洲精品午夜aaa久久久 | 亚洲色图 校园春色 | 成人免费大片黄在线播放 | 亚洲免费av在线播放 | 欧美激情综合五月色丁香小说 | 国内精品久久久久久久久久 | 99久久日韩精品免费热麻豆美女 | 毛片一区二区 | 婷婷国产在线 | 久久男人视频 | 国产一卡久久电影永久 | 91九色在线观看 | 大荫蒂欧美视频另类xxxx | 在线中文字幕观看 | 9热精品 | 黄色一及电影 | 久久精品美女视频网站 | 亚洲欧美视频在线观看 | 在线日本看片免费人成视久网 | 99色精品视频 | 日韩欧美高清一区二区三区 | 97在线观看视频国产 | 成人毛片a| 悠悠av资源片 | 午夜精品福利在线 | 国产成人福利片 | 在线三级中文 | 天天激情站 | 国产精品久久精品 | 欧美激情视频一区二区三区 | www色av| 色中色亚洲 | 一本一本久久aa综合精品 | 99视频精品免费视频 | 久久久国产精品电影 | 成人av.com | 免费在线观看国产精品 | 亚洲激情在线视频 | www.久久久精品 | 欧美一区二区伦理片 | 超碰免费av| 免费在线日韩 | 摸bbb搡bbb搡bbbb | 日日夜夜狠狠 | 在线黄色观看 | 99激情网 | 国产裸体bbb视频 | 久久亚洲二区 | 午夜精品视频免费在线观看 | 黄色成人av网址 | 欧美美女激情18p | 成人av一区二区兰花在线播放 | 97夜夜澡人人双人人人喊 | 天堂av观看 | 久久久久黄 | 日韩在线观看视频免费 | 激情欧美在线观看 | 日本爽妇网 | 成人在线视频免费 | 国产精品激情偷乱一区二区∴ | 日韩视频精品在线 | 国产精品毛片完整版 | 91黄色在线看 | 99精品视频一区 | 97网站| 久久久国产毛片 | 在线视频日韩精品 | 中文字幕av在线播放 | 国产精品午夜久久 | 国产精品毛片一区二区三区 | 亚洲精品高清在线 | 久久免费av | 国产一级视频在线观看 | 日韩av片免费在线观看 | 免费精品人在线二线三线 | 精品久久久影院 | 麻豆成人在线观看 | 亚洲最大激情中文字幕 | 国产粉嫩在线观看 | 国产资源免费 | 91网页版在线观看 | 在线久热| 青青河边草观看完整版高清 | 在线观看午夜 | 日韩乱码中文字幕 | 成人av网站在线观看 |