成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 一篇文章搞懂:詞法作用域、動態(tài)作用域、回調函數(shù)及閉包

一篇文章搞懂:詞法作用域、動態(tài)作用域、回調函數(shù)及閉包

熱門標簽:熱門電銷機器人 智能機器人電銷神器 okcc外呼系統(tǒng)怎么調速度 外呼電信系統(tǒng) 河南虛擬外呼系統(tǒng)公司 上海企業(yè)外呼系統(tǒng) 電話機器人哪里有賣 萬利達百貨商場地圖標注 惠州龍門400電話要怎么申請

前言

把以前一直只限于知道,卻不清晰理解的這幾個概念完完整整地梳理了一番。內容參考自wiki頁面,然后加上自己一些理解。

詞法作用域和動態(tài)作用域

不管什么語言,我們總要學習作用域(或生命周期)的概念,比如常見的稱呼:全局變量、包變量、模塊變量、本地變量、局部變量等等。不管如何稱呼這些作用域的范圍,實現(xiàn)它們的目的都一樣:

(1)為了避免名稱沖突;

(2)為了限定變量的生命周期(本文以變量名說事,其它的名稱在規(guī)則上是一樣的)。

但是不同語言的作用域規(guī)則不一樣,雖然學個簡單的基礎就足夠應用,因為我們有編程規(guī)范:(1)盡量避免名稱沖突;(2)加上類似于local的修飾符盡量縮小生效范圍;(3)放進代碼塊,等等。但是真正去細心驗證作用域的生效機制卻并非易事(我學Python的時候,花了很長時間細細驗證,學perl的時候又花了很長時間細細驗證),但可以肯定的是,理解本文的詞法作用域規(guī)則(Lexical scoping)和動態(tài)作用域規(guī)則(dynamic scoping),對學習任何語言的作用域規(guī)則都有很大幫助,這兩個規(guī)則是各種語言都宏觀通用的。

很簡單的一段bash下的代碼:

x=1
function g(){ echo "g: $x" ; x=2; }
function f(){ local x=3 ; g; echo "f: $x"; } # 輸出2還是3
f   # 輸出1還是3?
echo $x  # 輸出1還是2?

對于bash來說,上面輸出的分別是3(g函數(shù)中echo)、2(f函數(shù)中的echo)和1(最后一行echo)。但是同樣語義的代碼在其它語言下得到的結果可能就不一樣(分別輸出1、3和2,例如perl中將local替換為my)。

這牽扯到兩種貫穿所有程序語言的作用域概念:詞法作用域(類似于C語言中static)和動態(tài)作用域。詞法作用域和"詞法"這個詞真的沒什么關系,反而更應該稱之為"文本段作用域"。要區(qū)別它們,只需要回答"函數(shù)out_func中嵌套的內層函數(shù)in_func能否看見out_func中的環(huán)境"。

對于上面的bash代碼來說,假如這段代碼是適用于所有語言的偽代碼:

對于詞法作用域的語言,執(zhí)行f時會調用g,g將無法訪問f文本段的變量,詞法作用域認為g并不是f的一部分,而是跳出f的,因為g的定義文本段是在全局范圍內的,所以它是全局文本段的一部分。如果函數(shù)g的定義文本段是在f內部,則g屬于f文本段的一部分。

  • 所以g不知道f文本段中local x=3的設置,于是g的echo會輸出全局變量x=1,然后設置x=2,因為它沒有加上作用域修飾符,而g又是全局內的函數(shù),所以x將修改全局作用域的x值,使得最后的echo輸出2,而f中的echo則輸出它自己文本段中的local x=3。所以整個流程輸出1 3 2

對于動態(tài)作用域的語言,執(zhí)行f時會調用g,g將可以訪問f文本中的變量,動態(tài)作用域認為g是f文本段的一部分,是f中的嵌套函數(shù)。

  • 所以g能看到local x=3的設置,所以g的echo會輸出3。g中設置x=2后,僅僅只是在f的內層嵌套函數(shù)中設置,所以x=2對g文本段和f文本段(因為g是f的一部分)都可見,但對f文本段外部不可見,所以f中的echo輸出2,最后一行的echo輸出1。所以整個流程輸出3 2 1

總結來說:

  • 詞法作用域是關聯(lián)在編譯期間的,對于函數(shù)來說就是函數(shù)的定義文本段的位置決定這個函數(shù)所屬的范圍。
  • 動態(tài)作用域是關聯(lián)在程序執(zhí)行期間的,對于函數(shù)來說就是函數(shù)執(zhí)行的位置決定這個函數(shù)所屬的范圍。

由于bash實現(xiàn)的是動態(tài)作用域規(guī)則。所以,輸出的是3 2 1。對于perl來說,my修飾符實現(xiàn)詞法作用域規(guī)則,local修飾符實現(xiàn)動態(tài)作用域規(guī)則。

例如,使用my修飾符的perl程序:

#!/usr/bin/perl

$x=1;
sub g { print "g: $x\n"; $x=2; }
sub f { my $x=3; g(); print "f: $x\n"; } # 詞法作用域
f(); 
print "$x\n"; 

執(zhí)行結果:

[fairy@fairy:/perlapp]$ perl scope2.pl
g: 1
f: 3
2

使用local修飾符的perl程序:

#!/usr/bin/perl

$x=1;
sub g { print "g: $x\n"; $x=2; }
sub f { local $x=3; g(); print "f: $x\n"; } # 動態(tài)作用域
f(); 
print "$x\n"; 

執(zhí)行結果:

[fairy@fairy:/perlapp]$ perl scope2.pl
g: 3
f: 2
1

有些語言只支持一種作用域規(guī)則,特別是那些比較現(xiàn)代化的語言,而有些語言支持兩種作用域規(guī)則(正如perl語言,my實現(xiàn)詞法變量作用域規(guī)則,local實現(xiàn)動態(tài)作用域規(guī)則)。相對來說,詞法作用域規(guī)則比較好控制整個流程,還能借此實現(xiàn)更豐富的功能(如最典型的"閉包"以及高階函數(shù)),而動態(tài)作用域由于讓變量生命周期"沒有任何深度"(回想一下shell腳本對函數(shù)和作用域的控制,非常傻瓜化),比較少應用上,甚至有些語言根本不支持動態(tài)作用域。

閉包和回調函數(shù)

理解閉包、回調函數(shù)不可不知的術語

1.引用(reference):數(shù)據(jù)對象和它們的名稱

前文所說的可見、不可見、變量是否存在等概念,都是針對變量名(或其它名稱,如函數(shù)名、列表名、hash名)而言的,和變量的值無關。名稱和值的關系是引用(或指向)關系,賦值的行為就是將值所在的數(shù)據(jù)對象的引用(指針)交給名稱,讓名稱指向這個內存中的這個數(shù)據(jù)值對象。如下圖:

2.一級函數(shù)(first-class functions)和高階函數(shù)(high-order functions)

有些語言認為函數(shù)就是一種類型,稱之為函數(shù)類型,就像變量一樣。這種類型的語言可以:

將函數(shù)賦值給某個變量,那么這個變量就是這個函數(shù)體的另一個引用,就像是第二個函數(shù)名稱一樣。通過這個函數(shù)引用變量,可以找到函數(shù)體,然后調用執(zhí)行。

  • 例如perl中$ref_func=\myfunc表示將函數(shù)myfunc的引用賦值給$ref_func,那么$ref_func也指向這個函數(shù)。

將函數(shù)作為另一個函數(shù)的參數(shù)。例如兩個函數(shù)名為myfunc和func1,那么myfunc(func1)就將func1作為myfunc的參數(shù)。

  • 這種行為一般用于myfunc函數(shù)中對滿足某些邏輯的東西執(zhí)行func1函數(shù)。
  • 舉個簡單的例子,unix下的find命令,將find看作是一個函數(shù),它用于查找指定路徑下符合條件的文件名,將-print、-exec {}\;選項實現(xiàn)的功能看作是其它的函數(shù)(請無視它是否真的是函數(shù)),這些選項對應的函數(shù)是find函數(shù)的參數(shù),每當find函數(shù)找到符合條件的文件名時,就執(zhí)行-print函數(shù)輸出這個文件名

函數(shù)的返回值也可以是另一個函數(shù)。例如myfunc函數(shù)的定義語句為function myfunc(){ ...return func1 }

其實,實現(xiàn)上面三種功能的函數(shù)稱之為一級函數(shù)或高階函數(shù),其中高階函數(shù)至少要實現(xiàn)上面的2和3。一級函數(shù)和高階函數(shù)并沒有區(qū)分的必要,但如果一定要區(qū)分,那么:

  • 一級函數(shù)更像是一種術語概念,它將函數(shù)當作一種值看待,可以將其賦值出去、作為參數(shù)傳遞出去以及作為返回值,對于計算機程序語言而言,它更多的是用來描述某種語言是否支持一級函數(shù);
  • 高階函數(shù)是一種函數(shù)類型,就像回調函數(shù)一樣,當某個函數(shù)符合高階函數(shù)的特性,就可以將其稱之為這是一個高階函數(shù)。

3.自由變量(free variable)和約束變量(bound variable)

這是一組數(shù)學界的術語。

在計算機程序語言中,自由變量是指函數(shù)中的一種特殊變量,這種變量既不在本函數(shù)中定義,也不是本函數(shù)的參數(shù)。換句話說,可能是外層函數(shù)中定義的但卻在內層函數(shù)中使用的,所以自由變量常常和"非本地變量"(non-local variable,熟悉Python的人肯定知道)互用。例如:

function func1(x){
 var z;
 function func2(y){
  return x+y+z  # x和z既不是func2內部定義的,也不是func2的參數(shù),所以x和z都是自由變量
 }
 return func1
}

自由變量和約束變量對應。所謂約束變量,是指這個變量之前是自由變量,但之后會對它進行賦值,將自由變量綁定到一個值上之后,這個變量就成為約束變量或者稱為綁定變量。

例如:

function func1(x){
 var m=20  # 對func2來說,這是自由變量,對其賦值,所以m變成了bound variable
 var z
 function func2(y){
  z=10  # 對自由變量z賦值,z變成bound variable
  return m+x+y+z  # m、x和z都是自由變量
 }
 return func1
}

ref_func=func1(3)  # 對x賦值,x變成bound variable

回調函數(shù)

回調函數(shù)一開始是C里面的概念,它表示的是一個函數(shù):

  • 可以訪問另一個函數(shù)
  • 當這個函數(shù)執(zhí)行完了,會執(zhí)行另一個函數(shù)

也就是說,將一個函數(shù)(B)作為參數(shù)傳遞給另一個函數(shù)(A),但A執(zhí)行完后,再自動調用B。所以這種回調函數(shù)的概念也稱為"call after"。

但是現(xiàn)在回調函數(shù)已經(jīng)足夠通用化了。通用化的回調函數(shù)定義為:將函數(shù)B作為另一個函數(shù)A的參數(shù),執(zhí)行到函數(shù)A中某個地方的時候去調用B。和原來的概念相比,不再是函數(shù)A結束后再調用,而是我們自己定義在哪個地方調用。

例如,Perl中的File::Find模塊中的find函數(shù),通過這個函數(shù)加上回調函數(shù),可以實現(xiàn)和unix find命令相同的功能。例如,搜索某個目錄下的文件,然后print輸出這個文件名,即find /path xxx -print。

#!/usr/bin/perl
use File::Find;

sub print_path {   # 定義一個函數(shù),用于輸出路徑名稱
 print "$File::Find::name\n";
}

$callback = \print_path; # 創(chuàng)建一個函數(shù)引用,名為$callback,所以perl是一種支持一級函數(shù)的語言

find( $callback,"/tmp" ); # 查找/tmp下的文件,每查找到一個文件,就執(zhí)行一次$callback函數(shù)

這里傳遞給find函數(shù)的$callback就是一個回調函數(shù)。幾個關鍵點:

  • $callback作為參數(shù)傳遞給另一個find()函數(shù)(所以find()函數(shù)是一個高階函數(shù))
  • 在find()函數(shù)中,每查找到一個文件,就調用一次這個$callback函數(shù)。當然,如果find是我們自己寫的程序,就可以由我們自己定義在什么地方去調用$callback
  • $callback不是我們主動調用的,而是由find()函數(shù)在某些情況下(每查找到一個文件)去調用的

回調就像對函數(shù)進行填空答題一樣,根據(jù)我們填入的內容去復用填入的函數(shù)從而實現(xiàn)某一方面的細節(jié),而普通函數(shù)則是定義了就只能機械式地復用函數(shù)本身。

之所以稱為回調函數(shù),是因為這個函數(shù)并非由我們主觀地、直接地去調用,而是將函數(shù)作為一個參數(shù),通過被調用者間接去調用這個函數(shù)參數(shù)。本質上,回調函數(shù)和一般的函數(shù)沒有什么區(qū)別,可能只是因為我們定義一個函數(shù),卻從來沒有直接調用它,這一點感覺上有點奇怪,所以有人稱之為"回調函數(shù)",用來統(tǒng)稱這種間接的調用關系。

回調函數(shù)可以被多線程異步執(zhí)行。

徹底搞懂閉包

計算機中的閉包概念是從數(shù)學世界引入的,在計算機程序語言中,它也稱為詞法閉包、函數(shù)閉包。

閉包簡單的、通用的定義是指:函數(shù)引用一個詞法變量,在函數(shù)或語句塊結束后(變量的名稱消失),詞法變量仍然對引用它的函數(shù)有效。在下一節(jié)還有關于閉包更嚴格的定義(來自wiki)。

看一個python示例:函數(shù)f中嵌套了函數(shù)g,并返回函數(shù)g

def f(x):
 def g(y):
  return x + y
 return g # 返回一個閉包:有名稱的函數(shù)(高階函數(shù)的特性)

# 將執(zhí)行函數(shù)時返回的閉包函數(shù)賦值給變量(高階函數(shù)的特性)
a = f(1)

# 調用存儲在變量中閉包函數(shù)
print (a(5))

# 無需將閉包存儲進臨時變量,直接一次性調用閉包函數(shù)
print( f(1)(5) ) # f(1)是閉包函數(shù),因為沒有將其賦值給變量,所以f(1)稱為"匿名閉包"

上面的a是一個閉包,它是函數(shù)g()的一個實例。f()的參數(shù)x可以被g訪問,在f()返回g函數(shù)后,f()就退出了,隨之消失的是變量名x(注意是變量名稱x,變量的值在這里還不一定會消失)。當將閉包f(1)賦值給a后,原來x指向的數(shù)據(jù)對象(即數(shù)值1)仍被a指向的閉包函數(shù)引用著,所以x對應的值1在x消失后仍保存在內存中,只有當名為a的閉包被消除后,原來x指向的數(shù)值1才會消失。

閉包特性1:對于返回的每個閉包g()來說,不同的g()引用不同的x對應的數(shù)據(jù)對象。換句話說,變量x對應的數(shù)據(jù)對象對每個閉包來說都是相互獨立的

例如下面得到兩個閉包,這兩個閉包中持有的自由變量雖然都引用相等的數(shù)值1,但兩個數(shù)值是不同數(shù)據(jù)對象,這兩個閉包也是相互獨立的:

a=f(1)
b=f(1)

閉包特性2:對于某個閉包函數(shù)來說,只要這不是一個匿名閉包,那么閉包函數(shù)可以一直訪問x對應的數(shù)據(jù)對象,即使名稱x已經(jīng)消失

但是

a=f(1)   # 有名稱的閉包a,將一直引用數(shù)值對象1
a(3)    # 調用閉包函數(shù)a,將返回1+3=4,其中1是被a引用著的對象,即使a(3)執(zhí)行完了也不放開
a(3)    # 再次調用函數(shù)a,將返回4,其中1和上面一條語句的1是同一個數(shù)據(jù)對象
f(1)(3)   # 調用匿名的閉包函數(shù),數(shù)據(jù)對象1在f(1)(3)執(zhí)行完就消失
f(1)(3)   # 調用匿名的閉包函數(shù),和上面的匿名閉包是相互獨立的

最重要的特性就在于上面執(zhí)行的兩次a(3):將詞法變量的生命周期延長,但卻足夠安全。

看下面perl程序中的閉包函數(shù),可以更直觀地看到結果。

sub how_many {    # 定義函數(shù)
  my $count=2;   # 詞法變量$count
  return sub {print ++$count,"\n"}; # 返回一個匿名函數(shù),這是一個匿名閉包
}

$ref=how_many();  # 將閉包賦值給變量$ref

how_many()->();   # (1)調用匿名閉包:輸出3
how_many()->();   # (2)調用匿名閉包:輸出3
$ref->();      # (3)調用命名閉包:輸出3
$ref->();      # (4)再次調用命名閉包:輸出4

上面將閉包賦值給$ref,通過$ref去調用這個閉包,則即使how_many中的$count在how_many()執(zhí)行完就消失了,但$ref指向的閉包函數(shù)仍然在引用這個變量,所以多次調用$ref會不斷修改$count的值,所以上面(3)和(4)先輸出3,然后輸出改變后的4。而上面(1)和(2)的輸出都是3,因為兩個how_many()函數(shù)返回的是獨立的匿名閉包,在語句執(zhí)行完后數(shù)據(jù)對象3就消失了。

閉包更嚴格的定義

注意,嚴格定義的閉包和前面通俗定義的閉包結果上是不一樣的,通俗意義上的閉包并不一定符合嚴格意義上的閉包。

關于閉包更嚴格的定義,是一段誰都看不懂的說明(來自wiki)。如下,幾個關鍵詞我加粗顯示了,因為重要。

閉包是一種在支持一級函的編程語言中能夠將詞法作用域中的變量名稱進行綁定的技術。在操作上,閉包是一種用于保存函數(shù)和環(huán)境的記錄。這個環(huán)境記錄了一些關聯(lián)性的映射,將函數(shù)的每個自由變量與創(chuàng)建閉包時所綁定名稱的值或引用相關聯(lián)。通過閉包,就算是在作用域外部調用函數(shù),也允許函數(shù)通過閉包拷貝他們的值或通過引用的方式去訪問那些已經(jīng)被捕獲的變量。

我知道這段話誰都看不懂,所以簡而言之一下:一個函數(shù)實例和一個環(huán)境結合起來就是閉包。這個所謂的環(huán)境,決定了這個函數(shù)的特殊性,決定了閉包的特性。

還是上面的python示例:函數(shù)f中嵌套了函數(shù)g,并返回函數(shù)g

def f(x):
  def g(y):
    return x + y
  return g # 返回一個閉包:有名稱的函數(shù)

# 將執(zhí)行函數(shù)時返回的閉包函數(shù)賦值給變量
a = f(1)

上面的a是一個閉包,它是函數(shù)g()的一個實例。f()的參數(shù)x可以被g訪問,對于g()來說,這個x不是g()內部定義的,也不是g()的參數(shù),所以這個x對于g來說是一個自由變量(free variable)。雖然g()中持有了自由變量,但是g()函數(shù)自身不是閉包函數(shù),只有在g持有的自由變量x和傳遞給f()函數(shù)的x的值(即f(1)中的1)進行綁定的時候,才會從g()創(chuàng)建一個閉包函數(shù),這表示閉包函數(shù)開始引用這個自由變量,并且這個閉包一直持有這個變量的引用,即使f()已經(jīng)執(zhí)行完畢了。然后在f()中return這個閉包函數(shù),因為這個閉包函數(shù)綁定了(引用)自由變量x,這就是閉包函數(shù)所在的環(huán)境。

環(huán)境對閉包來說非常重要,是區(qū)別普通函數(shù)和閉包的關鍵。如果返回的每個閉包不是獨立持有屬于自己的自由變量,而是所有閉包都持有完全相同的自由變量,那么閉包雖然仍可稱為閉包,但和普通函數(shù)卻沒有區(qū)別了。例如:

def f(x):
  x=3
  def g(y):
    return x + y
  return g

a = f(1)
b = f(3)

在上面的示例中,x雖然是自由變量,但卻在g()的定義之前就綁定了值(前文介紹過,它稱為bound variable),使得閉包a和閉包b持有的不再是自由變量,而是值對象完全相同的綁定變量,其值對象為3,a和b這個時候其實沒有任何區(qū)別(雖然它們是不同對象)。換句話說,有了閉包a就完全沒有必要再定義另一個功能上完全相同的閉包b。

在函數(shù)復用性的角度上來說,這里的a和普通函數(shù)沒有任何區(qū)別,都只是簡單地復用了函數(shù)體。而真正嚴格意義上的閉包,除了復用函數(shù)體,還復用它所在的環(huán)境。

但是這樣一種情況,對于通俗定義的閉包來說,返回的g()也是一個閉包,但在嚴格定義的閉包中,這已經(jīng)不算是閉包。

再看一個示例:將自由變量x放在g()函數(shù)定義文本段的后面。

def f(y):
  return x+y

x=1

def g(z):
  x=3
  return f(z)

print(g(1))  # 輸出2,而不是4

首先要說明的是,python在沒有給任何作用域修飾符的時候實現(xiàn)的詞法作用域規(guī)則,所以上面return f(z)中的f()看見的是全局變量x(因為f()定義在全局文本段中),而不是g()中的x=3。

回到閉包問題上。上面f()持有一個自由變量x,這個f(z)的文本定義段是在全局文本段中,它綁定的自由變量x是全局變量(聲明并初始化為空或0),但是這個變量之后賦值為1了。對于g()中返回的每個f()所在的環(huán)境來說,它持有的自由變量x一開始都是不確定的,但是后來都確定為1了。這種情況也不能稱之為閉包,因為閉包是在f()對自由變量進行綁定時創(chuàng)建的,而這個時候x已經(jīng)是固定的值對象了。

回調函數(shù)、閉包和匿名函數(shù)

回調函數(shù)、閉包和匿名函數(shù)其實沒有必然的關系,但因為很多書上都將匿名函數(shù)和回調函數(shù)、閉包放在一起解釋,讓人誤以為回調函數(shù)、閉包需要通過匿名函數(shù)實現(xiàn)。實際上,匿名函數(shù)只是一個有函數(shù)定義文本段,卻沒有名稱的函數(shù),而閉包則是一個函數(shù)的實例加上一個環(huán)境(嚴格意義上的定義)。

對于閉包和匿名函數(shù)來說,仍然以python為例:

def f(x):
  def g(y):
    return x + y
  return g  # 返回一個閉包:有名稱的函數(shù)

def h(x):
  return lambda y: x + y # 返回一個閉包:匿名函數(shù)

# 將執(zhí)行函數(shù)時返回的閉包函數(shù)賦值給變量
a = f(1)
b = h(1)

# 調用存儲在變量中閉包函數(shù)
print (a(5))
print (b(5))

對于回調函數(shù)和匿名函數(shù)來說,仍然以perl的find函數(shù)為例:

#!/usr/bin/perl
use File::Find;

$callback = sub {
  print "$File::Find::name\n";
}; # 創(chuàng)建一個匿名函數(shù)以及它的引用

find( $callback,"/tmp" ); # 查找/tmp下的文件,每查找到一個文件,就執(zhí)行一次$callback函數(shù)

匿名函數(shù)讓閉包的實現(xiàn)更簡潔,所以很多時候返回的閉包函數(shù)就是一個匿名函數(shù)實例。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • perl 基本語法介紹
  • perl操作符詳細說明
  • perl 模式匹配參數(shù)詳解

標簽:百色 淮安 周口 周口 綿陽 秦皇島 合肥 綏化

巨人網(wǎng)絡通訊聲明:本文標題《一篇文章搞懂:詞法作用域、動態(tài)作用域、回調函數(shù)及閉包》,本文關鍵詞  一篇,文章,搞懂,詞法,作用域,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一篇文章搞懂:詞法作用域、動態(tài)作用域、回調函數(shù)及閉包》相關的同類信息!
  • 本頁收集關于一篇文章搞懂:詞法作用域、動態(tài)作用域、回調函數(shù)及閉包的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产日韩欧美一区| 欧美一区二区免费在线观看| 最新av在线| 狠狠躁狠狠躁视频专区| 亚洲成年电人电影网站| 在线观看av影片| 日本中文字幕在线2020| 色青青草原桃花久久综合| www国产免费| 女同性恋一区二区| 天堂…中文在线最新版在线| 天天综合网天天| 亚洲日韩中文字幕| 欧美大片拔萝卜| 无码久久精品国产亚洲av影片| a在线欧美一区| 久久精品无码一区二区三区毛片| 天天综合色天天综合色hd| 成人春色在线观看免费网站| 国产日韩专区在线| 97碰碰视频| 手机看片福利在线观看| 欧美一区三区四区| 欧美国产极速在线| 久久亚洲精精品中文字幕| 国产精品三级a三级三级午夜| 不卡电影免费在线播放一区| 亚洲电影视频在线| 2019av中文字幕| 免费av不卡| 欧美激情另类| 欧美亚韩一区二区三区| xxx.xxx欧美| 欧美日本精品| 亚洲国产激情一区二区三区| 精品国产免费观看| 日本成人三级电影网站| 日韩影视一区二区三区| 正在播放欧美一区| 真实原创一区二区影院| 久久久久久网站| 色妹子一区二区| 欧美喷潮久久久xxxxx| 超碰在线超碰在线| 国产又黄又粗又猛又爽| 久久精品国产亚洲av高清色欲| 午夜一级在线看亚洲| 精品国产一区二区三区av性色| 久热精品在线视频| 欧美成人精品在线| 丁香婷婷综合激情五月色| 视频一区二区三区在线看免费看| 欧美一级二级三级蜜桃| 日韩欧美成人一区二区三区| 欧美日韩成人精品| 在线看黄网址| 欧美成人午夜免费视在线看片| 欧美精品一区二| 欧美爱爱视频网站| 高清在线一区二区| 日韩成人网免费视频| 成人性生交大片免费看视频r| 精品久久久国产精品999| 在线亚洲一区| 国产精品热久久久久夜色精品三区| 精品久久av| 中文字幕在线网址| 成人一区二区在线观看| 免费的成人av| 真实新婚偷拍xxxxx| 一区二区传媒有限公司| 久久精品噜噜噜成人av农村| 91麻豆精品国产91久久久久推荐资源| 青春草国产视频| 国产系列精品av| 久久久不卡影院| 一二三区在线观看| 黄色免费网站视频| 天天综合日日夜夜精品| 久久久久久久综合| 欧美成人有码| 欧美在线视频你懂得| 亚洲欧美日韩国产综合精品二区| 久久亚洲无码视频| 99久久精品免费| 国产精品毛片一区二区三区四区| 热草久综合在线| 日韩**一区毛片| 精品国产乱码一区二区三区四区| 亚洲电影在线一区二区三区| 国产成人免费9x9x人网站视频| 亚洲国产免费av| 中文字幕日韩精品在线| 亚洲久久久久久久久久久| xfplay爱情电影网love| 国产精选一区二区三区不卡催乳| 欧美艳星brazzers| 女生裸体视频网站免费观看| 校园激情久久| 日韩中文字幕高清在线观看| 日韩精品欧美成人高清一区二区| 性直播体位视频在线观看| 亚洲免费伊人电影在线观看av| www.色视频| 一菊综合网成人综合网| 91精品办公室少妇高潮对白| 久艹视频在线观看| 91精品国自产在线观看| 国产在线一区二区三区欧美| 日韩中文字幕av电影| 成人毛片免费在线观看| 久久精品日产第一区二区三区精品版| 国产精品久久影院| 国产亚洲精品综合一区91| 99在线观看免费视频精品观看| 第一会所sis001亚洲| 91成人在线| 日韩成人a**站| 日韩高清电影免费| 一本久久a久久精品亚洲| 国产乱子伦一区二区三区国色天香| 91精品一区二区三区在线观看| 色婷婷一区二区三区| 美女又黄又免费| 肥女人的一级毛片| 欧美—级高清免费播放| 日韩av一二三| 日韩在线短视频| 亚洲综合欧美日韩| 鲁丝一区鲁丝二区鲁丝三区| 九九热精品视频在线观看| 亚洲国产免费看| 色窝窝无码一区二区三区| 欧美成免费一区二区视频| 黄色av免费在线观看| 国产欧美精品一区二区三区四区| 亚洲国产综合一区| 污污在线观看| 国产精品久久国产精品| 91免费电影网站| 欧美成年网站| 日韩视频在线观看一区二区三区| 伊人久久大香线蕉av一区二区| 日本a级片在线观看| 亚洲欧美一区二区精品久久久| 性欧美丰满熟妇xxxx性久久久| 风间由美一二三区av片| 伊大人久久香线焦宗合一75大| 国产精品96久久久久久又黄又硬| 亚洲色成人www永久在线观看| 亚洲一线在线观看| 日韩成人激情视频| 亚洲国产精品久久久久婷婷软件| 精品中文视频在线| 午夜av区久久| 性感美女视频一二三| 国产美女性感在线观看懂色av| 日韩一二三区视频| 国产66精品| 痴汉一区二区三区| 国产亚洲一区二区三区不卡| 色老汉一区二区三区| 男生操女生视频在线观看| 日韩久久久久久| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧妇女乱妇女乱视频| 精品伊人久久大线蕉色首页| 国产成人一区二区三区| 丁香六月婷婷| 国产精品第七影院| 欧美精品99| 亚洲伊人一本大道中文字幕| 国内精品中文字幕| 青青成人在线| 成人www视频网站免费观看| 欧美一区二区色| 一个人www欧美| 肉色超薄丝袜脚交一区二区| 亚洲综合在线第一页| 神马影视一区二区| 国产精品久久久久久久龚玥菲| 国产精品成人v| 国产成人精品综合| 中文亚洲欧美| 涩涩网站在线看| 九九视频免费在线观看| 丰满岳乱妇一区二区| 日韩精品一区二区亚洲av观看| 久久亚洲一区二区三区四区| 免费国产一区| 亚洲日本欧美在线| 视频一区在线播放| 日韩欧美国产成人精品免费| 日韩美女视频一区二区在线观看| 中文字幕在线视频不卡| 人妻精品一区一区三区蜜桃91| www五月天com| 亚洲精品小说| 精品一区免费av| 欧美午夜精品免费| 欧美12av| 欧美高清视频在线高清观看mv色露露十八| 4438x亚洲最大成人网| 首页亚洲欧美制服丝腿| av资源中文在线天堂| 波多野结衣av在线免费观看| 成人在线tv视频| 成人免费毛片东京热| 亚洲 日韩 国产第一区| 不卡av免费在线| 西西444www无码大胆| 亚洲黄色小说网址| 一区二区久久精品66国产精品| 久久中文字幕精品| 999成人精品视频线3| 久久精品日产第一区二区三区精品版| 2019中文亚洲字幕| 在线日韩一区二区| 欧美日韩综合不卡| 热99久久精品| 亚洲第一激情av| 欧洲亚洲免费视频| 一本久道在线| 国产精品成人av性教育| 亚洲成人在线视频网站| 国产日韩欧美一区在线| 亚洲自拍偷拍色片视频| 国产成人亚洲综合91| 日韩欧美亚洲范冰冰与中字| 男人天堂2024| 波多野结衣综合网| 精品一区二区在线看| 成人国产精品色哟哟| 国产精品灌醉下药二区| 老司机午夜性大片| 久久视频在线观看中文字幕| 亚洲精品国产偷自在线观看| 国产成人在线播放| 波多野结衣喷潮| 一级α片免费看刺激高潮视频| 日韩国产在线一区| 狠狠色噜噜狠狠狠| 忘忧草在线影院两性视频| 日韩电影在线视频| 国产性色一区二区| 成人全视频在线观看在线播放高清| 九一国产精品视频| 国产精品嫩草影院8vv8| 嫩草在线视频| 欧美在线影院在线视频| 来吧亚洲综合网| 国产伦精品一区二区三区88av| 亚洲福利视频在线| 久久精品这里只有精品| 欧美另类暴力丝袜| 鲁大师私人影院在线观看| 丰满岳妇乱一区二区三区| 综合久久中文字幕| 九色蝌蚪视频在线| 韩国女主播成人在线观看| 久久久久久色| 国产精品社区| 午夜久久久久久久久| 黄网站色欧美视频| 99久久免费国产精精品| 久久av免费观看| 国产精品麻豆入口| 很黄很色的网站| 国产高清在线观看免费不卡| 久久精品视频一| 日韩av在线播放不卡| 亚洲影视一区二区三区| 98色花堂精品视频在线观看| 国产精品1区2区在线观看| 日产精品久久久一区二区| 国产成人啪精品午夜在线观看| 国产精品无码一区二区三区免费| 中文字幕第7页| 亚洲日本理论电影| 一区二区三区蜜桃网| 亚洲av无一区二区三区久久| 黄色的网站在线观看| 日韩中文字幕二区| tube8在线hd| 日韩欧美在线免费观看| 亚洲不卡一卡2卡三卡4卡5卡精品| 色国产在线视频| 亚洲天堂最新地址| 久久免费视频观看| 日韩在线不卡视频| 日本美女一级片| 天堂在线中文资源| 精品国产一区二区国模嫣然| 日韩69视频在线观看| 国产传媒免费在线观看| 国产成人精品午夜视频免费| 亚洲男同1069视频| 色哟哟免费视频| 精品视频日韩| 91社区视频| mm视频在线视频| 国产精品一区二区三区四| 五月天一区二区三区| 好吊操视频这里只有精品| 人妻互换一二三区激情视频| 91美女片黄在线| 国产激情久久久| 国产乱子精品一区二区在线观看| 亚洲精品少妇| 成人免费一区二区三区| 成年人视频免费| 国产成人av免费观看| 欧美国产第二页| 羞羞小视频视频| av大片在线免费观看| 精品久久久无码人妻字幂| 国产精品久久久久久久乖乖| 日韩女同强女同hd| 国产福利片一区二区| √8天堂资源地址中文在线| 国产视频九色蝌蚪| 欧美一二区在线观看| 97视频在线观看网站| 九九亚洲视频| 熟女少妇一区二区三区| 亚洲国产精品精华素| 午夜影院日韩| 水莓100国产免费av在线播放|