成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript寫一個Once函數,讓傳入函數只執行一次

開發 前端
用 JavaScript 實現一個 once 函數,要求傳入函數只能執行一次。且第二次及以后再調用時,仍會返回第一次執行的值。

大家好,我是前端西瓜哥,今天我們做一道簡單的前端面試題。

用 JavaScript 實現一個 once 函數,要求傳入函數只能執行一次。且第二次及以后再調用時,仍會返回第一次執行的值。

效果要求如下:

const addOnce = once(function(a, b) {
return a + b;
});

addOnce(1, 2); // 3
addOnce(1, 2999); // 依舊是 3

思路和實現

這里涉及到一個 閉包 的概念。

什么是閉包?閉包是一種技術,它能讓 一個函數訪問另一個函數內的變量(或者叫關聯的環境)。

一種常見的方式就是調用一個函數 a,然后這個函數返回了一個新創建的函數 b。獲得的效果是:新的函數 b 可以訪問到 a 中聲明的變量。

once 函數就要借助閉包的力量,返回 一個綁定了作用域的新函數。

我們先看看實現。

function once(fn) {
let ret; // 緩存結果用
return function(...args) {
if (!fn) return ret;
ret = fn(...args);
fn = undefined; // 表示已經執行過一次
return ret;
}
}

利用閉包,我們返回的新函數有兩個 “私有” 的變量可以訪問:

  1. 傳入的 fn 函數;
  2. 額外聲明的用于緩存結果的 ret 變量

當返回的新函數被調用時,我們先將參數傳給 fn,拿到返回值緩存到 ret。然后將 fn 設置為 undefined,用于標識別已經執行了一次,最后返回 ret。

下次再調用時,我們通過判斷 fn 為 falsy,直接返回緩存的 ret。

另外,你貌似可以加多一個對 fn 的類型校驗:typeof fn === 'function',來向面試官表達你的代碼的健壯性。

有一個比較有趣的地方:如果返回的是個對象,多次調用的返回值其實都是指向同一個。如果你希望每次返回的對象都是新的對象,可以考慮返回一個拷貝后的對象(如果可以拷貝的話)。

結尾

once 的實現并不復雜,只要利用閉包,用封閉的環境保存一個緩存的返回值,以及一個是否執行過的狀態,就能控制函數的執行走向。

責任編輯:姜華 來源: 今日頭條
相關推薦

2018-08-07 14:45:52

編程語言JavaScripthtml

2015-05-25 15:06:28

JavaScript函數式編程

2009-06-09 21:50:55

Javascript函數getStyle

2020-04-20 09:02:33

函數RPCCPU

2020-06-11 11:16:36

戴爾

2016-11-29 13:31:52

JavaScriptsetTimeout定時執行

2014-02-14 09:37:01

JavascriptDOM

2017-07-27 08:56:59

javascriptJavaWeb

2023-06-06 08:28:58

Sync.OnceGolang

2021-06-16 17:46:55

函數指針結構

2022-07-26 16:08:43

print函數

2021-12-07 06:55:17

節流函數Throttle

2012-08-23 14:23:33

函數式編程

2020-10-18 12:53:29

黑科技網站軟件

2012-01-04 13:55:23

Canvas

2015-06-29 11:30:07

JavaScript小烏龜推箱子

2023-11-28 12:19:49

C++函數指針

2016-12-06 09:34:33

線程框架經歷

2016-08-11 10:11:07

JavaScript函數編程

2020-10-16 08:26:07

JavaScript開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区国产精品 | 欧美bondage紧缚视频 | av国产精品毛片一区二区小说 | 欧美性久久 | 婷婷一级片 | 影音先锋中文字幕在线观看 | 亚洲一区不卡在线 | 欧美在线精品一区 | 亚洲婷婷六月天 | 激情91| 在线观看中文视频 | 18gay男同69亚洲网站 | 一区二区三区免费 | 日韩综合在线 | 国产精品一区二区在线 | 在线一区| 久久精品亚洲精品国产欧美 | 看一级黄色毛片 | 在线观看国产h | 色综合99 | 中文字幕在线一区 | 小早川怜子xxxxaⅴ在线 | 一区二区三区四区日韩 | 一区二区三区精品视频 | 日韩电影免费观看中文字幕 | 亚洲天堂久久 | 免费在线观看av的网站 | 热久久性| 国产a级毛毛片 | 亚洲精品二区 | 日韩一区二区免费视频 | 91视频久久| 国产精品一区二区在线播放 | 国产精品久久久久久久久久久久冷 | 午夜视频免费在线观看 | 亚洲福利在线视频 | 米奇狠狠鲁 | 搞黄网站在线观看 | 亚洲最色视频 | 国产99久久精品一区二区永久免费 | 欧美aⅴ|