亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript函數(shù)式編程(0):函數(shù)基礎(chǔ) arguments、this、apply()、cal

陳偉 / 2029人閱讀

摘要:參數(shù)引用函數(shù)的上下文,函數(shù)上下文來自于等面向?qū)ο笳Z言,中的依賴于函數(shù)聲明。沒有重載函數(shù)沒有簽名,因為其參數(shù)是由包含零或多個值的數(shù)組來表示的。這就是重載函數(shù)。重載函數(shù)常用來實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。

1 函數(shù)參數(shù)

函數(shù)的實參和形參個數(shù)可以不等,之所以會這樣,原因是 ECMAScript 中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)(如果有參數(shù)的話)。如果實參個數(shù)大于形參個數(shù),多余的實參不傳遞值,但是在arguments中可以訪問;如果形參個數(shù)大于實參,沒有傳遞值的實參將自動被賦予 undefined 值。

2 arguments和this

所有的函數(shù)調(diào)用都會傳遞兩個隱式參數(shù):arguments和this。
實際上,在函數(shù)體內(nèi)可以通過 arguments對象來訪問這個參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個參數(shù)。arguments 對象只是與數(shù)組類似(它并不是 Array 的實例),因為可以使用方括號語法訪問它的每一個元素(arguments[0]、argumetns[1]…),也使用 length 屬性來確定傳遞進(jìn)來多少個參數(shù)。

arguments對象的值永遠(yuǎn)與對應(yīng)命名參數(shù)的值保持同步:

function doAdd(num1, num2) {
    arguments[1] = 10;
    alert(arguments[0] + num2);
}

因為 arguments對象中的值會自動反映到對應(yīng)的命名參數(shù),所以修改 arguments[1],也就修改了 num2,結(jié)果它們的值都會變成 10。不過,這并不是說讀取這兩個值會訪問相同的內(nèi)存空間;它們的內(nèi)存空間是獨立的,但它們的值會同步。另外還要記住,如果只傳入了一個參數(shù),那么為 arguments[1]設(shè)置的值不會反應(yīng)到命名參數(shù)中(num2保持undefined)。這是因為 arguments 對象的長度是由傳入的參數(shù)個數(shù)決定的,不是由定義函數(shù)時的命名參數(shù)的個數(shù)決定的。

this參數(shù)引用函數(shù)的上下文,函數(shù)上下文來自于Java等面向?qū)ο笳Z言,Java中的this依賴于函數(shù)聲明。但是和Java不同,JavaScript中的this依賴于函數(shù)的調(diào)用方式,因此把this稱為調(diào)用上下文很合適。一般函數(shù)有四種調(diào)用方式:簡單函數(shù)調(diào)用;對象方法調(diào)用;作為構(gòu)造函數(shù)調(diào)用;通過apply()和call()調(diào)用。這四種方式的主要區(qū)別就在于調(diào)用上下文不同:簡單函數(shù)調(diào)用的上下文是window對象,方法調(diào)用的上下文是對象,構(gòu)造函數(shù)的上下文是是新創(chuàng)建的對象實例。這些調(diào)用中函數(shù)的this指向都是固定的,但是只有apply()和call()調(diào)用可以自主定義上下文。

3 apply()/call():在特定的作用域中調(diào)用函數(shù)。

區(qū)別在于接收參數(shù)的方式不同:apply(argu1,argu2),argu1是函數(shù)運行的作用域(this),argu2是參數(shù)數(shù)組,可以傳入arguments 對象或者參數(shù)數(shù)組;call(argu1,argu2), argu1是this,argu2是逐個列出的函數(shù)參數(shù)。
如果你打算直接傳入 arguments 對象,或者包含函數(shù)中先接收到的也是一個數(shù)組,那么使用 apply()肯定更方便;否則,選擇 call()可能更合適。(在不給函數(shù)傳遞參數(shù)的情況下,使用哪個方法都無所謂。)
傳遞參數(shù)并非 apply()和 call()真正的用武之地;它們真正強大的地方是能夠擴(kuò)充函數(shù)賴以運行的作用域。使用 call()(或 apply())來擴(kuò)充作用域的最大好處,就是對象不需要與方法有任何耦合關(guān)系。

當(dāng)需要為函數(shù)指定上下文時,就有必要使用apply()和 call()了,一個具體的例子就是回調(diào)函數(shù)。假如對數(shù)組中的每個元素進(jìn)行一次操作,命令式編程方式一般使用for循環(huán)遍歷數(shù)組元素,但是函數(shù)式編程是編寫一個函數(shù),然后對每個數(shù)組元素運行該函數(shù),區(qū)別在于函數(shù)式編程更有利于代碼復(fù)用。對每個數(shù)組元素運行該函數(shù)有兩種思路,一種是把數(shù)組元素作為參數(shù)傳入,一種是把數(shù)組參數(shù)作為函數(shù)運行的上下文,這時就可以用到apply()和 call()。

function forEach(list, callback){
for(var n=0; n

使用callback回調(diào)函數(shù)的call方法,將當(dāng)前數(shù)組元素作為第一個參數(shù)傳入,將當(dāng)前數(shù)組索引作為第二個參數(shù)傳入,這使得當(dāng)前元素變?yōu)楹瘮?shù)上下文,索引值作為callback()的參數(shù)。在callback()內(nèi)部驗證當(dāng)前元素是否是上下文。

4 沒有重載(overloading)

ECMAScirpt函數(shù)沒有簽名,因為其參數(shù)是由包含零或多個值的數(shù)組來表示的。而沒有函數(shù)簽名,真正的重載是不可能做到的。如果在 ECMAScript 中定義了兩個名字相同的函數(shù),則該名字只屬于后定義的函數(shù)。
函數(shù)重載定義:重載函數(shù)是函數(shù)的一種特殊情況,為方便使用,C++允許在同一范圍中聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)、類型或者順序)必須不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數(shù)。重載函數(shù)常用來實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/80646.html

相關(guān)文章

  • JavaScript函數(shù)編程0):函數(shù)基礎(chǔ) arguments、thisapply()、cal

    摘要:參數(shù)引用函數(shù)的上下文,函數(shù)上下文來自于等面向?qū)ο笳Z言,中的依賴于函數(shù)聲明。沒有重載函數(shù)沒有簽名,因為其參數(shù)是由包含零或多個值的數(shù)組來表示的。這就是重載函數(shù)。重載函數(shù)常用來實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。 1 函數(shù)參數(shù) 函數(shù)的實參和形參個數(shù)可以不等,之所以會這樣,原因是 ECMAScript 中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪...

    liuchengxu 評論0 收藏0
  • JavaScript函數(shù)編程

    摘要:本文試圖盡可能系統(tǒng)的描述函數(shù)式編程。函數(shù)式編程使用參數(shù)保存狀態(tài),最好的例子就是遞歸。柯里化函數(shù)有利于指定函數(shù)行為,并將現(xiàn)有函數(shù)組合為新函數(shù)。 JavaScript函數(shù)式編程 摘要 以往經(jīng)??吹胶瘮?shù)式編程這一名詞,卻始終沒有花時間去學(xué)習(xí),暑期實習(xí)結(jié)束之后一直忙于邊養(yǎng)老邊減肥,81天成功瘦身30斤+ ,開始回歸正常的學(xué)習(xí)生活。便在看《JavaScript函數(shù)式編程》這本書,以系統(tǒng)了解函數(shù)式...

    animabear 評論0 收藏0
  • JavaScript 的繼承方及優(yōu)缺點

    摘要:繼承簡介在的中的面向?qū)ο缶幊?,繼承是給構(gòu)造函數(shù)之間建立關(guān)系非常重要的方式,根據(jù)原型鏈的特點,其實繼承就是更改原本默認(rèn)的原型鏈,形成新的原型鏈的過程。 showImg(https://segmentfault.com/img/remote/1460000018998684); 閱讀原文 前言 JavaScript 原本不是純粹的 OOP 語言,因為在 ES5 規(guī)范中沒有類的概念,在 ...

    nanchen2251 評論0 收藏0
  • JavaScript || 函數(shù)

    摘要:每個函數(shù)表達(dá)式包括函數(shù)對象括號和傳入的實參組成。和作用都是動態(tài)改變函數(shù)體內(nèi)指向,只是接受參數(shù)形式不太一樣。在定義函數(shù)時,形參指定為一個對象調(diào)用函數(shù)時,將整個對象傳入函數(shù),無需關(guān)心每個屬性的順序。 函數(shù) JavaScript中,函數(shù)指只定義一次,但可以多次被多次執(zhí)行或調(diào)用的一段JavaScript代碼。與數(shù)組類似,JavaScript中函數(shù)是特殊的對象,擁有自身屬性和方法 每個函數(shù)對象...

    learn_shifeng 評論0 收藏0
  • 掌握JavaScript函數(shù)的柯里化

    摘要:原文鏈接和都支持函數(shù)的柯里化函數(shù)的柯里化還與的函數(shù)編程有很大的聯(lián)系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識點函數(shù)部分的閉包高階函數(shù)不完全函數(shù)文章后面有對這些知識的簡單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數(shù)的柯里化,JavaScript函數(shù)的柯里化還與JavaScript的函數(shù)編程有很大的聯(lián)系,如果你感興...

    DTeam 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<