第14題 鏈式呼叫和argument

2021-09-27 06:24:43 字數 1842 閱讀 2794

設計乙個sum函式,使其滿足以下要求

sum(1, 2).sumof() // 返回 3

sum(1, 2)(3).sumof() // 返回 6

sum(1)(2, 3, 4).sumof() // 返回 10

sum(1, 2)(3, 4)(5).sumof() // 返回 15

這道題目主要考察以下兩點:

函式引數arguments的應用;

函式的鏈式呼叫實現;

arguments

arguments物件是函式(非箭頭)內部都可以訪問到的區域性變數,該物件是乙個類陣列物件,具有陣列的length,索引特性。

function print () 

print(1, 2, 3);

array.prototype.shift.call(arguments);

// 將arguments轉為陣列,array引數為乙個,並且是整數時,表示陣列長度,超過乙個時表示陣列元素

鏈式編碼原理

鏈式呼叫原理就是作用域鏈,實現需要做如下的工作:

因為需要鏈式呼叫,所以需要返回物件本身的引用;

利用閉包,儲存累計值,以便最後返回;

示例:

function add (num) 

_b.valueof = function()

return _b

}var c = add(1)(2)(3);

console.log(c)    //6

下面我們來詳細分析一下**:

首先,在add方法內部,我們是通過私有的_b方法實現的加法,而不是在add方法自身實現的,這裡涉及到了函式式程式設計,這個概念我們就不在此做展開了,有興趣的童鞋可以自己研究一下,可以說這是一種很不錯的開發模式;add第一次執行後,返回了_b方法;

在返回的_b方法中我們形成了對count的閉包,這樣我們可以實現累計加和;還有一點需要注意,就是_b方法每次執行時都返回了它自身,這就實現了鏈式;

最後,也是比較關鍵的,就是在輸出add的結果,即add(1)(2)(3)的結果時,如何讓它輸出count,這裡涉及了valueof和tostring方法的知識,還是那句話,感興趣的童鞋可以自己研究一下;在這裡最後能夠正確輸出6的原理是:_b是function,是object的一種特殊形式,當我們做類似列印console等操作時,會自動呼叫其valueof方法(其實底層實現沒有我說的這麼簡單,哈哈,但是大概是這麼個意思),所以我們重寫了valueof方法來達到返回count的目的;

綜上,我們的面試題目,就可以做如下實現:

function sum () 

fn.sumof = function () )

}return fn;

}

利用閉包,設定變數ary儲存函式鏈式呼叫期間的所有引數;

自定義內部函式,呼叫時返回自身;

定義fn的靜態方法sumof,用於計算陣列ary的引數和;

下面是我實現的另一種方式,但需要設定乙個函式靜態變數值儲存資料:

function sum() 

sum.result += s;

return sum;

}sum.result = 0;

sum.sumof = function ()

【前端名獅】

C Prime 第14章 前30題

過載運算子與內建運算子 區別 1 某些運算物件的求值規則無法在過載運算子中儲存下來.比如 和 的短路求值特性被捨棄.2 過載運算子必須要求至少有乙個成員是class型別 相同 1 一般來說,優先順序,結合律和運算元的數目是一致的.2 一般來說,表達的邏輯是相同的.friend std istream...

C Prime 第14章後23題

智慧型指標或內建型別,可以自己管理自己擁有的資源,於是使用編譯器合成的拷貝控制函式就滿足要求了.classx private strblobptr ptr 過載的函式呼叫運算子最少接受0個物件,最多接受無限個物件.pragma once include using namespace std 圖省事...

Promise的鏈式呼叫和axios處理高併發

最近在專案中又遇到了乙個介面的請求需要依賴另乙個介面的請求結果和處理高併發的場景了,所以即興在這裡簡單總結和分享下,歡迎指正和補充。一 promise 簡要回顧 promise 是乙個建構函式,作為 es6 中最重要的特性之一,它有 all resolve reject race 眼熟的方法,原型上...