主頁 > 前端設計 > Js函式

Js函式

2021-02-22 10:20:02 前端設計

目錄

  • JavaScript 函式定義
    • 自呼叫函式
    • 箭頭函式
  • JavaScript 函式引數
    • 引數規則
    • 默認引數
    • ES6 函式可以自帶引數
    • arguments 物件
  • JavaScript 函式呼叫
    • this 關鍵字
    • 呼叫 JavaScript 函式
    • 作為一個函式呼叫
    • 函式作為方法呼叫
    • 使用建構式呼叫函式
    • 作為函式方法呼叫函式
  • JavaScript 閉包
    • 全域變數
    • JavaScript 內嵌函式
    • JavaScript 閉包
    • 實體決議
    • 博客參考

JavaScript 函式定義

JavaScript 使用關鍵字 function 定義函式,
函式可以通過宣告定義,也可以是一個運算式,
函式宣告

function functionName(parameters) {
  執行的代碼
}

函式宣告后不會立即執行,會在我們需要的時候呼叫到,

分號是用來分隔可執行JavaScript陳述句,

由于函式宣告不是一個可執行陳述句,所以不以分號結束,

函式運算式
JavaScript 函式可以通過一個運算式定義,
函式運算式可以存盤在變數中:

var x = function (a, b) {return a * b};

在函式運算式存盤在變數后,變數也可作為一個函式使用:

var x = function (a, b) {return a * b};
var z = x(4, 3);

以上函式實際上是一個 匿名函式 (函式沒有名稱),
函式存盤在變數中,不需要函式名稱,通常通過變數名來呼叫,

上述函式以分號結尾,因為它是一個執行陳述句,

Function() 建構式
在以上實體中,我們了解到函式通過關鍵字 function 定義,
函式同樣可以通過內置的 JavaScript 函式構造器(Function())定義,

var myFunction = function (a, b) {return a * b};

var x = myFunction(4, 3);

在 JavaScript 中,很多時候,你需要避免使用 new 關鍵字,

函式提升(Hoisting)
在之前的教程中我們已經了解了 “hoisting(提升)”,
提升(Hoisting)是 JavaScript 默認將當前作用域提升到前面去的的行為,
提升(Hoisting)應用在變數的宣告與函式的宣告,
因此,函式可以在宣告之前呼叫:

myFunction(5);

function myFunction(y) {
    return y * y;
}

使用運算式定義函式時無法提升,

自呼叫函式

函式運算式可以 “自呼叫”,
自呼叫運算式會自動呼叫,
如果運算式后面緊跟 () ,則會自動呼叫,
不能自呼叫宣告的函式,
通過添加括號,來說明它是一個函式運算式:

以上函式實際上是一個 匿名自我呼叫的函式 (沒有函式名),

函式可作為一個值使用

function myFunction(a, b) {
    return a * b;
}

var x = myFunction(4, 3);

JavaScript 函式可作為運算式使用:

function myFunction(a, b) {
    return a * b;
}

var x = myFunction(4, 3) * 2;

函式是物件
在 JavaScript 中使用 typeof 運算子判斷函式型別將回傳 “function” ,
但是JavaScript 函式描述為一個物件更加準確,
JavaScript 函式有 屬性方法
arguments.length 屬性回傳函式呼叫程序接收到的引數個數:

toString() 方法將函式作為一個字串回傳:

函式定義作為物件的屬性,稱之為物件方法,
函式如果用于創建新的物件,稱之為物件的建構式,

箭頭函式

ES6 新增了箭頭函式,
箭頭函式運算式的語法比普通函式運算式更簡潔,

(引數1, 引數2,, 引數N) => { 函式宣告 }

(引數1, 引數2,, 引數N) => 運算式(單一)
// 相當于:(引數1, 引數2, …, 引數N) =>{ return 運算式; }

沒有引數的函式應該寫成一對圓括號:

() => {函式宣告}
  • 有的箭頭函式都沒有自己的 this, 不適合定義一個 物件的方法,
  • 當我們使用箭頭函式的時候,箭頭函式會默認幫我們系結外層 this的值,所以在箭頭函式中 this 的值和外層的 this 是一樣的,
  • 箭頭函式是不能提升的,所以需要在使用之前定義,
  • 使用 const比使用 var 更安全,因為函式運算式始終是一個常量,
  • 如果函式部分只是一個陳述句,則可以省略 return 關鍵字和大括號{},這樣做是一個比較好的習慣:

JavaScript 函式引數

JavaScript 函式對引數的值沒有進行任何的檢查,

functionName(parameter1, parameter2, parameter3) {
    // 要執行的代碼……
}

函式顯式引數在函式定義時列出,
函式隱式引數在函式呼叫時傳遞給函式真正的值,

引數規則

JavaScript 函式定義顯式引數時沒有指定資料型別,
JavaScript 函式對隱式引數沒有進行型別檢測,
JavaScript 函式對隱式引數的個數沒有進行檢測,

默認引數

ES5 中如果函式在呼叫時未提供隱式引數,引數會默認設定為: undefined
有時這是可以接受的,但是建議最好為引數設定一個默認值:

實體(ES5)
function myFunction(x, y) {
    if (y === undefined) {
          y = 0;
    } 
}

或者,更簡單的方式:

實體(ES5)
function myFunction(x, y) {
    y = y || 0;
}

如果y已經定義 , y || 回傳 y, 因為 y 是 true, 否則回傳 0, 因為 undefined 為 false,

如果函式呼叫時設定了過多的引數,引數將無法被參考,因為無法找到對應的引數名, 只能使用 arguments 物件來呼叫,

ES6 函式可以自帶引數

ES6 支持函式帶有默認引數,就判斷 undefined 和 || 的操作:

實體(ES6function myFunction(x, y = 10) {
    // 如果不傳入引數 y ,則其默認值為 10
    return x + y;
}
// 輸出 2
document.getElementById("demo1").innerHTML = myFunction(0, 2) ;
// 輸出 15, y 引數的默認值
document.getElementById("demo2").innerHTML = myFunction(5);

arguments 物件

JavaScript 函式有個內置的物件 arguments 物件,
argument 物件包含了函式呼叫的引數陣列,
通過這種方式你可以很方便的找到最大的一個引數的值:

x = findMax(1, 123, 500, 115, 44, 88);
 
function findMax() {
    var i, max = arguments[0];
    
    if(arguments.length < 2) return max;
 
    for (i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
    }
    return max;
}

通過值傳遞引數

在函式中呼叫的引數是函式的隱式引數,

JavaScript 隱式引數通過值來傳遞:函式僅僅只是獲取值,

如果函式修改引數的值,不會修改顯式引數的初始值(在函式外定義),

隱式引數的改變在函式外是不可見的,


通過物件傳遞引數
在JavaScript中,可以參考物件的值,
因此我們在函式內部修改物件的屬性就會修改其初始的值,
修改物件屬性可作用于函式外部(全域變數),
修改物件屬性在函式外是可見的,

JavaScript 函式呼叫

JavaScript 函式有 4 種呼叫方式,
每種方式的不同在于 this 的初始化,

this 關鍵字

一般而言,在Javascript中,this指向函式執行時的當前物件,
注意 this 是保留關鍵字,你不能修改 this 的值,

呼叫 JavaScript 函式

在之前的章節中我們已經學會了如何創建函式,
函式中的代碼在函式被呼叫后執行,

作為一個函式呼叫

function myFunction(a, b) {
    return a * b;
}
myFunction(10, 2);           // myFunction(10, 2) 回傳 20

以上函式不屬于任何物件,但是在 JavaScript 中它始終是默認的全域物件,
在 HTML 中默認的全域物件是 HTML 頁面本身,所以函式是屬于 HTML 頁面,
在瀏覽器中的頁面物件是瀏覽器視窗(window 物件),以上函式會自動變為 window 物件的函式,
myFunction() 和 window.myFunction() 是一樣的:

function myFunction(a, b) {
    return a * b;
}
window.myFunction(10, 2);    // window.myFunction(10, 2) 回傳 20

這是呼叫 JavaScript 函式常用的方法, 但不是良好的編程習慣
全域變數,方法或函式容易造成命名沖突的bug,

全域物件
當函式沒有被自身的物件呼叫時 this 的值就會變成全域物件,
在 web 瀏覽器中全域物件是瀏覽器視窗(window 物件),
該實體回傳 this 的值是 window 物件:

function myFunction() {
    return this;
}
myFunction();                // 回傳 window 物件  [object Window]

函式作為全域物件呼叫,會使 this 的值成為全域物件,
使用 window 物件作為一個變數容易造成程式崩潰,

函式作為方法呼叫

在 JavaScript 中你可以將函式定義為物件的方法,
以下實體創建了一個物件 (myObject), 物件有兩個屬性 (firstNamelastName), 及一個方法 (fullName):

var myObject = {
    firstName:"John",
    lastName: "Doe",
    fullName: function () {
        return this.firstName + " " + this.lastName;
    }
}
myObject.fullName();         // 回傳 "John Doe"

fullName 方法是一個函式,函式屬于物件, myObject 是函式的所有者,
this物件,擁有 JavaScript 代碼,實體中 this 的值為 myObject 物件,
測驗以下!修改 fullName 方法并回傳 this 值:

var myObject = {
    firstName:"John",
    lastName: "Doe",
    fullName: function () {
        return this;
    }
}
myObject.fullName();          // 回傳 [object Object] (所有者物件)

函式作為物件方法呼叫,會使得 this 的值成為物件本身,

使用建構式呼叫函式

如果函式呼叫前使用了 new 關鍵字, 則是呼叫了建構式,
這看起來就像創建了新的函式,但實際上 JavaScript 函式是重新創建的物件:

// 建構式:
function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName  = arg2;
}
 
// This    creates a new object
var x = new myFunction("John","Doe");
x.firstName;                             // 回傳 "John"

建構式的呼叫會創建一個新的物件,新物件會繼承建構式的屬性和方法,

建構式中 this 關鍵字沒有任何的值,
this 的值在函式呼叫實體化物件(new object)時創建,

作為函式方法呼叫函式

在 JavaScript 中, 函式是物件,JavaScript 函式有它的屬性和方法,
call()apply() 是預定義的函式方法, 兩個方法可用于呼叫函式,兩個方法的第一個引數必須是物件本身,

function myFunction(a, b) {
    return a * b;
}
myObject = myFunction.call(myObject, 10, 2);     // 回傳 20
function myFunction(a, b) {
    return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray);  // 回傳 20

兩個方法都使用了物件本身作為第一個引數, 兩者的區別在于第二個引數: apply傳入的是一個引數陣列,也就是將多個引陣列合成為一個陣列傳入,而call則作為call的引數傳入(從第二個引數開始),
在 JavaScript 嚴格模式(strict mode)下, 在呼叫函式時第一個引數會成為 this 的值, 即使該引數不是一個物件,
在 JavaScript 非嚴格模式(non-strict mode)下, 如果第一個引數的值是 null 或 undefined, 它將使用全域物件替代,

通過 call() 或 apply() 方法你可以設定 this 的值, 且作為已存在物件的新方法呼叫,

this 是 JavaScript 語言的一個關鍵字,
它代表函式運行時,自動生成的一個內部物件,只能在函式內部使用,比如:

function test() {
    this.x = 1;
}

隨著函式使用場合的不同,this 的值會發生變化,但是有一個總的原則,那就是this指的是,呼叫函式的那個物件,

作為函式方法呼叫函式時,此函式執行了相當于 java 中靜態函式的功能,

<script>
var myObject, myArray;
myObject={
    name: "hahaha ",
    hsk: "en"
};
function myFunction(a, b) {
    alert(this);
    return this.name +this.hsk;
}
myArray = [10, 2]
myObject = myFunction.apply(myObject, myArray);       
document.getElementById("demo").innerHTML = myObject; 
</script>

可以用的頻率較高的函式作這樣的設定,為物件執行相關操作,

JavaScript 閉包

JavaScript 變數可以是區域變數或全域變數,
私有變數可以用到閉包,

全域變數

函式可以訪問由函式內部定義的變數,如:

function myFunction() {
    var a = 4;
    return a * a;
}

函式也可以訪問函式外部定義的變數,如:

var a = 4;
function myFunction() {
    return a * a;
}

后面一個實體中, a 是一個 全域 變數,
在web頁面中全域變數屬于 window 物件,
全域變數可應用于頁面上的所有腳本,
在第一個實體中, a 是一個 區域 變數,
區域變數只能用于定義它函式內部,對于其他的函式或腳本代碼是不可用的,
全域和區域變數即便名稱相同,它們也是兩個不同的變數,修改其中一個,不會影響另一個的值,

變數宣告時如果不使用 var 關鍵字,那么它就是一個全域變數,即便它在函式內定義,

變數生命周期
全域變數的作用域是全域性的,即在整個JavaScript程式中,全域變數處處都在,
而在函式內部宣告的變數,只在函式內部起作用,這些變數是區域變數,作用域是區域性的;函式的引數也是區域性的,只在函式內部起作用,

計數器困境
設想下如果你想統計一些數值,且該計數器在所有函式中都是可用的,
你可以使用全域變數,函式設定計數器遞增:

var counter = 0;
 
function add() {
   return counter += 1;
}
 
add();
add();
add();
 
// 計數器現在為 3

計數器數值在執行 add() 函式時發生變化,
但問題來了,頁面上的任何腳本都能改變計數器,即便沒有呼叫 add() 函式,
如果我在函式內宣告計數器,如果沒有呼叫函式將無法修改計數器的值:

function add() {
    var counter = 0;
    return counter += 1;
}
 
add();
add();
add();
 
// 本意是想輸出 3, 但事與愿違,輸出的都是 1 !

以上代碼將無法正確輸出,每次我呼叫 add() 函式,計數器都會設定為 1,

JavaScript 內嵌函式可以解決該問題,


JavaScript 內嵌函式

所有函式都能訪問全域變數,
實際上,在 JavaScript 中,所有函式都能訪問它們上一層的作用域,
JavaScript 支持嵌套函式,嵌套函式可以訪問上一層的函式變數,
該實體中,內嵌函式 plus() 可以訪問父函式的 counter 變數:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();    
    return counter; 
}

如果我們能在外部訪問 plus() 函式,這樣就能解決計數器的困境,
我們同樣需要確保 counter = 0 只執行一次,
我們需要閉包,

JavaScript 閉包

還記得函式自我呼叫嗎?該函式會做什么?

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
 
add();
add();
add();
 
// 計數器為 3

實體決議

變數 add 指定了函式自我呼叫的回傳字值,
自我呼叫函式只執行一次,設定計數器為 0,并回傳函式運算式,
add變數可以作為一個函式使用,非常棒的部分是它可以訪問函式上一層作用域的計數器,
這個叫作 JavaScript 閉包,它使得函式擁有私有變數變成可能,
計數器受匿名函式的作用域保護,只能通過 add 方法修改,

閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護里面的私有變數不受外界干擾,直觀的說就是形成一個不銷毀的堆疊環境,

博客參考

JS閉包的理解

閉包,看這一篇就夠了——帶你看透閉包的本質,百發百中

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/262063.html

標籤:其他

上一篇:html 修改 ul li 的格式

下一篇:3D酷炫扭動卡片 html+css+js

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more