成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

陳偉 / 2004人閱讀

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

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

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

2 arguments和this

所有的函數(shù)調(diào)用都會(huì)傳遞兩個(gè)隱式參數(shù):arguments和this。
實(shí)際上,在函數(shù)體內(nèi)可以通過(guò) arguments對(duì)象來(lái)訪(fǎng)問(wèn)這個(gè)參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)。arguments 對(duì)象只是與數(shù)組類(lèi)似(它并不是 Array 的實(shí)例),因?yàn)榭梢允褂梅嚼ㄌ?hào)語(yǔ)法訪(fǎng)問(wèn)它的每一個(gè)元素(arguments[0]、argumetns[1]…),也使用 length 屬性來(lái)確定傳遞進(jìn)來(lái)多少個(gè)參數(shù)。

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

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

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

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

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

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

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

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

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

4 沒(méi)有重載(overloading)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80646.html

相關(guān)文章

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

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

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

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

    animabear 評(píng)論0 收藏0
  • JavaScript 的繼承方及優(yōu)缺點(diǎn)

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

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

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

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

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

    DTeam 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<