[英]Better coding of making a check each time function runs
我試圖消除功能中的無用檢查,需要在應用程序啟動時分配所需的檢查變量,所以我不想每次都檢查它。
我有這樣的代碼:
btnClose.addEventListener('click', function(e) {
window.close()
if (appSettings.sendAnonymousStats) {
visitor.event("Application", "App has been closed.").send()
}
})
這是我第一次嘗試對其進行優化,因此現在無需在每次調用時都進行“ if”檢查。
let btnCloseEv = appSettings.sendAnonymousStats ? btnClose.addEventListener('click', function(e) {
window.close()
visitor.event("Application", "App has been closed.").send()
}) : btnClose.addEventListener('click', function(e) {
window.close()
})
我想知道理論上是否有更好的方法來實現我要達到的目標?
刪除單個if語句,特別是考慮到每次單擊僅發生一次,將完全不會影響運行時間。
但是,出於討論的目的,它說對性能至關重要,就像將它附加到onmousemove一樣,那么您可以通過少量更改來調整第二種方法,以減少代碼冗余。
let btnCloseEv = btnClose.addEventListener('click',
appSettings.sendAnonymousStats ?
function(e) {
window.close();
visitor.event("Application", "App has been closed.").send();
} : function(e) {
window.close();
}
)
之所以可行,是因為JS中的函數是高階函數,這意味着它們被視為變量,並且可以像傳遞變量一樣傳遞。 例如,如果a和b是數字,函數或任何其他類型的變量,則此方法有效。
var c = someBoolean ? a : b;
function moreComplexFunc(e) { window.close(); visitor.event("Application", "App has been closed.").send(); // More complex code } function simpleFunc(e) { window.close(); } let btnCloseEv = btnClose.addEventListener( 'click', appSettings.sendAnonymousStats ? moreComplexFunc : simpleFunc )
moreComplexFunc
和simpleFunc
有很多代碼重復,您可以更進一步,並將類似的代碼分成第三個函數,如下所示:
function commonFunc(e) { window.close(); } function func1(e) { commonFunc(e); visitor.event("Application", "App has been closed.").send(); // other code } function func2(e) { commonFunc(e); // other code } let btnCloseEv = btnClose.addEventListener( 'click', appSettings.sendAnonymousStats ? func1 : func2 )
支持高階功能的語言所帶來的機會確實是無窮無盡的。
萬一函數有些復雜,另一種方法是將其簡單地放在一個附加的事件處理程序中:
let btnCloseEv = btnClose.addEventListener('click',
function(e) {
window.close();
/*
... more code ...
*/
}
)
if (appSettings.sendAnonymousStats) {
btnClose.addEventListener('click',
function(e) {
visitor.event("Application", "App has been closed.").send();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.