日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript寫一個Once函數(shù),讓傳入函數(shù)只執(zhí)行一次

用 JavaScript 實現(xiàn)一個 once 函數(shù),要求傳入函數(shù)只能執(zhí)行一次。且第二次及以后再調(diào)用時,仍會返回第一次執(zhí)行的值。

效果要求如下:

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

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

思路和實現(xiàn)

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

什么是閉包?閉包是一種技術(shù),它能讓 一個函數(shù)訪問另一個函數(shù)內(nèi)的變量(或者叫關(guān)聯(lián)的環(huán)境)。

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

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

我們先看看實現(xiàn)。

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

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

  1. 傳入的 fn 函數(shù);
  2. 額外聲明的用于緩存結(jié)果的 ret 變量

當(dāng)返回的新函數(shù)被調(diào)用時,我們先將參數(shù)傳給 fn,拿到返回值緩存到 ret。然后將 fn 設(shè)置為 undefined,用于標(biāo)識別已經(jīng)執(zhí)行了一次,最后返回 ret。

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

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

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

結(jié)尾

once 的實現(xiàn)并不復(fù)雜,只要利用閉包,用封閉的環(huán)境保存一個緩存的返回值,以及一個是否執(zhí)行過的狀態(tài),就能控制函數(shù)的執(zhí)行走向。


新聞標(biāo)題:JavaScript寫一個Once函數(shù),讓傳入函數(shù)只執(zhí)行一次
網(wǎng)址分享:http://m.5511xx.com/article/cogdsps.html