如何使 Function 只執行一次 ?
栏目: JavaScript · 发布时间: 5年前
内容简介:實務上某些 function 會傳入ECMAScript 2015很明顯會印出
實務上某些 function 會傳入 Array.prototype.forEach()
,但我們只想執行一次而已,如符合條件就只執行一次,其餘僅管符合條件,但都不執行,我們該怎麼做呢 ?
Version
ECMAScript 2015
Scenario
const func = item => console.log(item); [1, 2, 3].forEach(func);
很明顯會印出 1
、 2
與 3
。
但我們想只印出 1
即可, 2
與 3
都不要印。
Closure
const createFunc = () => { let count = 0; return item => { if (count++) return; console.log(item); }; }; const func = createFunc(); [1, 2, 3].forEach(func);
一個很直覺的思考方式,希望有個 count
variable 幫我們統計,若 count
為 0
就印,其他都不要印。
ECMAScript 要達成這種 private variable,必須依賴 Closure,所以特別另外建立 createFunc()
,使 count
成為其 local variable,然後 return 新 function,使其與 count
做連結。
count
為 0
時為 Falsy Value,因此印出 1
,但 count
為 1
之後就為 Truth Value,就不再繼續執行。
const createFunc = () => { let once = false; return item => { if (once) return; console.log(item); once = true; }; }; const func = createFunc(); [1, 2, 3].forEach(func);
一樣使用 Closure,但既然只執行一次,其實不必使用 counter,只需一個 Boolean flag 即可。
一開始令 once
為 false
,因此會印出 1
,印完馬上令 once
為 true
,從此就不會再印出任何值。
Property
const func = item => { func.once || console.log(item); func.once = true; }; [1, 2, 3].forEach(func);
ECMAScript 是動態語言,可以動態建立 property,利用這個語言特性,其實可把動態建立 property 當成 private variable 使用。
一開始沒有 once
property,為 Falsy Value,因此 ||
會印出 1
。
然後馬上建立 once
property,並令其為 false
,之後就再也不會印出任何值。
Conclusion
- Closure 是 ECMAScript 很精彩的語言特性,在 OOP 必須借用 private field 實現的功能,在 FP 可藉由 Closure 實現
- 動態建立 property 也是 ECMAScript 很精彩的語言特性,利用其不存在 property 為
undefined
的特性,視其為 Falsy Value,執行完後再動態建立 property 為ture
,當成 local variable 使用
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Getting Started with C++ Audio Programming for Game Development
David Gouveia
Written specifically to help C++ developers add audio to their games from scratch, this book gives a clear introduction to the concepts and practical application of audio programming using the FMOD li......一起来看看 《Getting Started with C++ Audio Programming for Game Development》 这本书的介绍吧!