摘要:參數引用函數的上下文,函數上下文來自于等面向對象語言,中的依賴于函數聲明。沒有重載函數沒有簽名,因為其參數是由包含零或多個值的數組來表示的。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。
1 函數參數
函數的實參和形參個數可以不等,之所以會這樣,原因是 ECMAScript 中的參數在內部是用一個數組來表示的。函數接收到的始終都是這個數組,而不關心數組中包含哪些參數(如果有參數的話)。如果實參個數大于形參個數,多余的實參不傳遞值,但是在arguments中可以訪問;如果形參個數大于實參,沒有傳遞值的實參將自動被賦予 undefined 值。
2 arguments和this所有的函數調用都會傳遞兩個隱式參數:arguments和this。
實際上,在函數體內可以通過 arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數。arguments 對象只是與數組類似(它并不是 Array 的實例),因為可以使用方括號語法訪問它的每一個元素(arguments[0]、argumetns[1]…),也使用 length 屬性來確定傳遞進來多少個參數。
arguments對象的值永遠與對應命名參數的值保持同步:
function doAdd(num1, num2) { arguments[1] = 10; alert(arguments[0] + num2); }
因為 arguments對象中的值會自動反映到對應的命名參數,所以修改 arguments[1],也就修改了 num2,結果它們的值都會變成 10。不過,這并不是說讀取這兩個值會訪問相同的內存空間;它們的內存空間是獨立的,但它們的值會同步。另外還要記住,如果只傳入了一個參數,那么為 arguments[1]設置的值不會反應到命名參數中(num2保持undefined)。這是因為 arguments 對象的長度是由傳入的參數個數決定的,不是由定義函數時的命名參數的個數決定的。
this參數引用函數的上下文,函數上下文來自于Java等面向對象語言,Java中的this依賴于函數聲明。但是和Java不同,JavaScript中的this依賴于函數的調用方式,因此把this稱為調用上下文很合適。一般函數有四種調用方式:簡單函數調用;對象方法調用;作為構造函數調用;通過apply()和call()調用。這四種方式的主要區別就在于調用上下文不同:簡單函數調用的上下文是window對象,方法調用的上下文是對象,構造函數的上下文是是新創建的對象實例。這些調用中函數的this指向都是固定的,但是只有apply()和call()調用可以自主定義上下文。
3 apply()/call():在特定的作用域中調用函數。區別在于接收參數的方式不同:apply(argu1,argu2),argu1是函數運行的作用域(this),argu2是參數數組,可以傳入arguments 對象或者參數數組;call(argu1,argu2), argu1是this,argu2是逐個列出的函數參數。
如果你打算直接傳入 arguments 對象,或者包含函數中先接收到的也是一個數組,那么使用 apply()肯定更方便;否則,選擇 call()可能更合適。(在不給函數傳遞參數的情況下,使用哪個方法都無所謂。)
傳遞參數并非 apply()和 call()真正的用武之地;它們真正強大的地方是能夠擴充函數賴以運行的作用域。使用 call()(或 apply())來擴充作用域的最大好處,就是對象不需要與方法有任何耦合關系。
當需要為函數指定上下文時,就有必要使用apply()和 call()了,一個具體的例子就是回調函數。假如對數組中的每個元素進行一次操作,命令式編程方式一般使用for循環遍歷數組元素,但是函數式編程是編寫一個函數,然后對每個數組元素運行該函數,區別在于函數式編程更有利于代碼復用。對每個數組元素運行該函數有兩種思路,一種是把數組元素作為參數傳入,一種是把數組參數作為函數運行的上下文,這時就可以用到apply()和 call()。
function forEach(list, callback){ for(var n=0; n使用callback回調函數的call方法,將當前數組元素作為第一個參數傳入,將當前數組索引作為第二個參數傳入,這使得當前元素變為函數上下文,索引值作為callback()的參數。在callback()內部驗證當前元素是否是上下文。
4 沒有重載(overloading)ECMAScirpt函數沒有簽名,因為其參數是由包含零或多個值的數組來表示的。而沒有函數簽名,真正的重載是不可能做到的。如果在 ECMAScript 中定義了兩個名字相同的函數,則該名字只屬于后定義的函數。
函數重載定義:重載函數是函數的一種特殊情況,為方便使用,C++允許在同一范圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/50136.html
摘要:參數引用函數的上下文,函數上下文來自于等面向對象語言,中的依賴于函數聲明。沒有重載函數沒有簽名,因為其參數是由包含零或多個值的數組來表示的。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。 1 函數參數 函數的實參和形參個數可以不等,之所以會這樣,原因是 ECMAScript 中的參數在內部是用一個數組來表示的。函數接收到的始終都是這個數組,而不關心數組中包含哪...
摘要:本文試圖盡可能系統的描述函數式編程。函數式編程使用參數保存狀態,最好的例子就是遞歸。柯里化函數有利于指定函數行為,并將現有函數組合為新函數。 JavaScript函數式編程 摘要 以往經常看到函數式編程這一名詞,卻始終沒有花時間去學習,暑期實習結束之后一直忙于邊養老邊減肥,81天成功瘦身30斤+ ,開始回歸正常的學習生活。便在看《JavaScript函數式編程》這本書,以系統了解函數式...
摘要:繼承簡介在的中的面向對象編程,繼承是給構造函數之間建立關系非常重要的方式,根據原型鏈的特點,其實繼承就是更改原本默認的原型鏈,形成新的原型鏈的過程。 showImg(https://segmentfault.com/img/remote/1460000018998684); 閱讀原文 前言 JavaScript 原本不是純粹的 OOP 語言,因為在 ES5 規范中沒有類的概念,在 ...
摘要:每個函數表達式包括函數對象括號和傳入的實參組成。和作用都是動態改變函數體內指向,只是接受參數形式不太一樣。在定義函數時,形參指定為一個對象調用函數時,將整個對象傳入函數,無需關心每個屬性的順序。 函數 JavaScript中,函數指只定義一次,但可以多次被多次執行或調用的一段JavaScript代碼。與數組類似,JavaScript中函數是特殊的對象,擁有自身屬性和方法 每個函數對象...
摘要:原文鏈接和都支持函數的柯里化函數的柯里化還與的函數編程有很大的聯系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識點函數部分的閉包高階函數不完全函數文章后面有對這些知識的簡單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數的柯里化,JavaScript函數的柯里化還與JavaScript的函數編程有很大的聯系,如果你感興...
閱讀 1625·2021-11-11 10:59
閱讀 2630·2021-09-04 16:40
閱讀 3666·2021-09-04 16:40
閱讀 2986·2021-07-30 15:30
閱讀 1663·2021-07-26 22:03
閱讀 3171·2019-08-30 13:20
閱讀 2233·2019-08-29 18:31
閱讀 444·2019-08-29 12:21