更好的编码,每次功能运行时进行检查

时间:2015-06-11 11:14:38

标签: javascript variables

我试图消除函数中无用的检查,在应用程序启动时分配了所需的检查变量,所以我不想每次都检查它。

我有这样的代码:

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()
})

我想知道理论上是否有更好的方法来实现我想要实现的目标?

2 个答案:

答案 0 :(得分:2)

删除单个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
)

<小时/> 现在说你注意到moreComplexFuncsimpleFunc中有很多代码重复,你可以更进一步,并将类似的代码分成第三个函数,如下所示:

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
)

支持高阶函数的语言中的机会真是无穷无尽。

答案 1 :(得分:1)

如果函数稍微复杂一点,另一种方法是简单地将它放在一个额外的事件处理程序中:

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();
        }
}