溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

web前端實例分析

發(fā)布時間:2022-02-25 10:49:22 來源:億速云 閱讀:148 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹了web前端實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇web前端實例分析文章都會有所收獲,下面我們一起來看看吧。

正文

這題的規(guī)則是這樣的

給定有一個 Add 函數,要支持以下形式的調用


Add(1)(2)(3).sumOf(); // 輸出 6
Add(1,2)(3)(4).sumOf(); // 輸出 10
Add(1,2,...)(3)(4)(...).sumOf();  // ...

拿到這種題目,我先來說說我自己的做題流程,一般會去找它最簡單的形態(tài)。我們一步一步來拆解。

先去掉 sumOf() 變成了以下形態(tài)

Add(1,2,...)(3)(4)(...)

嗯....有點熟悉...但是還是有點復雜,那我們再去掉無限調用這個限制。

Add(1,2,...)(3)(4)

唔,還是有點難呀...沒關系,再砍, 不要傳入多個參數。

Add(1)(2)(3)

有....有....有那味了....這....這不就是柯里化嗎....

有些小朋友可能沒有聽過,對于大朋友而言耳熟能詳,融會貫通。

我們還是來介紹一下。

在《javascript高級程序設計》這本書中有如下介紹:

與函數綁定緊密相關的主題是函數柯里化,它用于創(chuàng)建已經設置好的一個或者多個參數的函數。函數柯里化的基本方法和函數綁定是一樣的:使用一個閉包返回一個函數。兩者的區(qū)別在于,當函數被調用時,返回的函數還需要設置一些傳入的參數。

我們來寫寫看:

function Add(x) {
 return function (y) {
  return return functio (z) {
   return x + y + z;
  }
 }
}
// 簡潔寫法
const Add = x => y => z => x+y+z;

執(zhí)行一下

Add(1)(2)(3) // 6

是我們要的那味~

那么我們既然已經寫出了這個形態(tài),我們就一步一步反推。

這個時候千萬別緊張,我們從最低級的形態(tài)出發(fā),寫出一個最基本的形態(tài),能夠有效地幫助我們建立自信心,吃下定心丸,按照這種方式,哪怕我們最終沒有寫出完美的結果,讓面試官看到你思考解題的過程,也是一種加分。

好,接著說~

那我們接下來需要實現這個樣子。

Add(1,2,...)(3)(4)

傳入參數不止一個

我們知道,對于不確定參數個數,我們可以使用 arguments 這個對象來獲取到所有的入參,但是 arguments 不是一個 Array,但是我們可以使用 ES6 中的 Spread syntax展開語法)去將他變成一個數組。表演繼續(xù)。

function Add() {
 const nums = [...arguments];
 return function() {
  nums.push(...arguments);
  return function() {
   nums.push(...arguments);
   return nums.reduce((a, b) => a + b);
  }
 }
}

nice!已經離我們最終的形態(tài)越來越近了。接下來是這個函數能夠無限的進行調用。

Add(1,2,...)(3)(4)(...)

那么怎么樣才能無限調用呢?沒錯,用遞歸。

function Add() {
 const nums = [...arguments];
 function AddPro() {
  nums.push(...arguments);
    return AddPro;
 }
 return AddPro;
}

嗯,其實我們寫到這里發(fā)現了... 由于是無限遞歸,我們沒辦法確定最后一次函數調用,因此我們需要最后顯式調用一個結束的方法來打印出最后的數據。

很自然地,我們可以在 AddPro 添加一個方法 sumOf 來解決這個問題。

學弟就是卡在這里地方,被函數添加上一個方法搞懵了。你是否知道呢?

function Add() {
 const nums = [...arguments];
 function AddPro() {
  nums.push(...arguments);
    return AddPro;
 }
 AddPro.sumOf = () => {
  return nums.reduce((a, b) => a + b);
 }
 return AddPro;
}

好啦好啦,結束啦。

等等

在最后,我再來補充一種方案,function 不僅可以繼續(xù)掛載 function ~ 還可以掛載變量哦~

function Add() {
 if (!Add.nums) {
   Add.nums = [];
  }
  Add.nums.push(...arguments);
  return Add;
}
Add.sumOf = () => {
 return Add.nums.reduce((a, b) => a + b);
}

我們總結一下,小小的面試題涉及到的基礎知識。

閉包、遞歸、作用域、函數與對象

基礎就是基礎,永遠是你爸爸,掌握好基礎,以不變應萬變。

關于“web前端實例分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“web前端實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI