我正在尝试消除函数中无用的检查,所需的检查变量是在应用程序启动时分配的,所以我不想每次都检查它。
我有这样的代码:
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();
}
}