<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
once
函數的起源可以追溯到函數語言程式設計。在函數語言程式設計中,函數被視為不可變的,這意味著它們不應修改任何狀態或參照任何狀態。因此,在函數語言程式設計中,通常需要一些技巧來處理一些常見問題,例如避免在多次呼叫相同函數時進行冗餘計算。
once
函數是解決此問題的一種方法。它可以將函數轉換為只能呼叫一次的函數,並使用一些技巧來避免冗餘計算。使用 once
函數可以減少計算時間和資源的消耗,並提高應用程式的效能。
once
函數在現代 JavaScript 庫和框架中非常常見,例如 lodash
。它們提供了許多內建的 once
函數來處理各種場景和問題。在實際開發中,我們可以使用這些函數來提高程式碼的可維護性和可讀性,避免冗餘計算和網路請求,並提高應用程式的效能。
export function once<T extends Function>(this: unknown, fn: T): T { const _this = this; let didCall = false; let result: unknown; return function () { if (didCall) { return result; } didCall = true; result = fn.apply(_this, arguments); return result; } as unknown as T; }
這個實現比較簡單,但還是詳細分析解釋一下程式碼
once<T extends Function>(this: unknown, fn: T): T
。該函數使用了泛型引數**T
,表示被封裝的原始函數的型別。它還定義了一個this
引數,表示封裝函數中的this
關鍵字的型別為unknown
,以及一個fn
**引數,表示被封裝的原始函數。_this
變數參照了函數中的this
關鍵字,並將其儲存在變數中。didCall
變數用於跟蹤函數是否已經被呼叫過。result
**變數用於儲存函數的結果。didCall
**標記為已呼叫,並呼叫原始函數並儲存結果。最後,返回結果。T
**。lodash
到目前的版本已經是高度封裝了,它的原始碼可以在**github.com/lodash/loda…**看到:
function once(func) { return before(2, func) }
它本身是呼叫了 before
函數, before
是一個經過高度抽象的函數,它在被呼叫次數達到指定次數之前,會繼續執行傳入的函數,而在達到指定次數時,會返回最後一次執行傳入函數的結果:
function before(n, func) { let result if (typeof func !== 'function') { throw new TypeError('Expected a function') } return function(...args) { if (--n > 0) { result = func.apply(this, args) } if (n <= 1) { func = undefined } return result } }
對於 lodash
這樣的工具庫而言,它的抽象層次要比 vscode
更高,但實現的原理是相同的,核心都是利用閉包,通過內部變數的狀態來判斷函數是否已經被呼叫過,從而保證原始函數只被執行一次。
**once
**函數是一個常見的JavaScript函數,它用於確保一個函數只能被呼叫一次。這個函數在以下幾個場景下非常有用:
once
**函數來確保它只會被呼叫一次,並將結果快取下來。在之後的呼叫中,函數會直接返回快取的結果,而不會再次執行計算。這可以節省計算時間和資源,並提高應用程式的效能。once
**函數來確保只傳送一次請求,並在之後的呼叫中直接返回結果。這可以避免傳送重複的網路請求,並提高應用程式的響應速度。once
**函數來確保這些程式碼只會被執行一次,避免不必要的重複操作。在VSCode中, once
用的非常頻繁,通過檢視 reference
我們可以看到非常多的使用:
在 once
函數內部,定義了一個名為 _this
的變數,它儲存了函數的 this
關鍵字。這是因為,在使用 apply
或 call
方法呼叫函數時,需要確保函數中的 this
關鍵字被正確地繫結。如果沒有儲存 _this
變數,而是直接使用 this
關鍵字,可能會導致 this
關鍵字在多次呼叫中被意外地修改,從而導致錯誤或異常。
在使用 once
函數時,如果原始函數需要使用 this
關鍵字,需要確保 this
關鍵字被正確地繫結。看看以下程式碼:
class Counter { private count = 0; constructor(private readonly name: string) {} increment() { console.log(`${this.name}: Count = ${++this.count}`); } } const counter1 = new Counter('Counter 1'); const counter2 = new Counter('Counter 2'); const incrementOnce = once(counter1.increment); incrementOnce.call(counter1); // 輸出 "Counter 1: Count = 1" incrementOnce.call(counter2); // 輸出 "Counter 1: Count = 2",而不是 "Counter 2: Count = 1" incrementOnce.call(counter1); // 輸出 "Counter 1: Count = 2"
在上述程式碼中,如果我們在多次呼叫 incrementOnce
函數時,使用了不同的 this
關鍵字,可能會導致輸出結果不正確。例如,上述程式碼中的第二次呼叫 incrementOnce
函數時,使用了 counter2
作為 this
關鍵字,而實際上 incrementOnce
函數中儲存的 this
關鍵字是 counter1
,因此輸出結果為 "Counter 1: Count = 2",而不是 "Counter 2: Count = 1"。
因此,在使用 once
函數時,需要確保原始函數能夠正確地處理 this
關鍵字,並且在呼叫 once
函數時,應該指定正確的 this
關鍵字,以避免意外的錯誤或異常。
本文對 once
函數進行了詳細的剖析,包括其背景、實現原理和應用場景。在實際開發中,once
函數可以用於快取函數的結果、避免重複網路請求以及確保只執行一次的初始化程式碼。在使用 once
函數時,需要注意原始函數的 this
關鍵字的繫結,以避免意外的錯誤或異常。
在我們的日常開發中,見過太多的程式碼為了保證只執行一次,在本地定一個類似 flag
的變數來控制,這種寫法非常不優雅,在這種場景下,使用 once
函數是一個更好的選擇。
以上就是vscode工具函數once使用範例深入剖析的詳細內容,更多關於vscode工具函數once的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45