当前位置:  开发笔记 > 编程语言 > 正文

Javascript:什么更有效,IF块或TRY/CATCH?

如何解决《Javascript:什么更有效,IF块或TRY/CATCH?》经验,为你挑选了3个好方法。

我对这段代码中效率更高的其他一些看法很感兴趣.基本上在下面的代码中,有一个setInterval循环,我需要在代码在循环中运行之前满足4个要求.所以在第1节我写了一个if语句检查所有4.工作正常.

然后我切换到只使用try/catch,我想要执行的代码坐在try {}中.逻辑是在每个循环期间,将生成异常但针对每个无效条件进行抑制.在所有条件都为真的最后一个循环中,代码执行并清除间隔.

要么有效.我喜欢try/catch方法,因为我需要编写更少的条件代码并担心破坏.但是我担心try/catch的效率非常低,特别是在一个100ms的setInterval()循环中.关于SO的其他聪明人的一些看法是什么?

试着抓

var intvar = setInterval(function(){
try{    
    clearInterval(intvar);

    jQuery('#'+nav[pageid].t1+'>a').replaceWith(jQuery(''+jQuery('#'+nav[pageid].t1+'>a').text()+''));

    //set display classes for nav
    jQuery('#'+nav[pageid].t1).addClass('selected').find('#'+nav[pageid].t2).addClass('subselect'); //topnav
    jQuery('#'+nav[pageid].t3).addClass('selected').find('#'+nav[pageid].t4).addClass('subselect'); //leftnav
}catch(err){}
},100);

IF块

var intvar = setInterval(function(){

if(typeof jQuery == 'function' && typeof nav == 'object' && typeof pageid != 'undefined' && typeof document.getElementById('leftnav') == 'object'){
    clearInterval(intvar);
    jQuery('#'+nav[pageid].t1+'>a').replaceWith(jQuery(''+jQuery('#'+nav[pageid].t1+'>a').text()+''));

    //set display classes for nav
    jQuery('#'+nav[pageid].t1).addClass('selected').find('#'+nav[pageid].t2).addClass('subselect'); //topnav
    jQuery('#'+nav[pageid].t3).addClass('selected').find('#'+nav[pageid].t4).addClass('subselect'); //leftnav
}

},100);

cdmckay.. 19

异常应该用于特殊情况下(即你不要指望正常发生的事情).你不应该,在一般情况下,使用异常捕捉的东西,你可以用一个if语句测试.

另外,据我所知,异常比if语句昂贵得多.



1> cdmckay..:

异常应该用于特殊情况下(即你不要指望正常发生的事情).你不应该,在一般情况下,使用异常捕捉的东西,你可以用一个if语句测试.

另外,据我所知,异常比if语句昂贵得多.


完全不同意这个相当大胆的声明.例如在Python [`try except`是首选](http://stackoverflow.com/questions/1835756/using-try-vs-if-in-python)另外,要说某些东西是"昂贵的",一些数据将是不错.再次,在Python ["if"更"昂贵"](http://stackoverflow.com/a/3929887/1167879).

2> Will..:

使用if语句.我不知道TRY/CATCH的开销是多少,但我怀疑它比评估布尔表达式要大得多.要点击TRY/CATCH,你必须:执行一个语句,生成一个错误[带有相关的开销],记录错误(大概),做一个堆栈跟踪(大概),并移回代码.此外,如果您必须调试这些行附近的代码,真正的错误可能会被您的TRY/CATCHing混淆.

此外,它是对TRY/CATCH的误用,并且可能使您的代码更难以阅读.假设您为更长或更多混淆的案例执行此操作?你的捕获量最终会在哪里?

这称为异常处理

编辑:如下所述,如果实际导致异常,则只会获取运行时性能命中.



3> Schwern..:

其他答案是正确的,try/catch是针对特殊情况和错误处理. if条件是程序逻辑."哪个更快?" 这是错误的问题.

一个好的经验法则,如果你没有做任何例外,它可能不是一个例外!

要弄清楚要使用哪个,让我们分解你的if条件.

    typeof jQuery == 'function' 是否定义了jQuery()函数?

    typeof nav == 'object' nav全局变量是否包含对象?

    typeof pageid != 'undefined' 是否定义了pageid全局变量?

    typeof document.getElementById('leftnav') == 'object' 文档是否包含leftnav元素?

第一个显然是个例外.没有jQuery()函数,你没有走得太远.

第二个也是例外.没有导航对象,你不会去任何地方.

第三个是例外.你需要一个pageid来做任何事情.

第四个可能是逻辑."只有在存在leftnav元素时才运行此代码".这很难分辨,因为其余的代码没有引用leftnav元素!只有评论,红旗.所以这可能是编程错误.

所以我可能会这样做(如果我正在屠杀jQuery,请道歉):

var intvar = setInterval(function() {
    // If there's no leftnav element, don't do anything.
    if( typeof document.getElementById('leftnav') != 'object') {
        return;
    }

    try {
        clearInterval(intvar);
        jQuery('#'+nav[pageid].t1+'>a')
            .replaceWith(jQuery(''+jQuery('#'+nav[pageid].t1+'>a').text()+''));

        //set display classes for nav
        jQuery('#'+nav[pageid].t1)
            .addClass('selected')
            .find('#'+nav[pageid].t2)
            .addClass('subselect');     //topnav
        jQuery('#'+nav[pageid].t3)
            .addClass('selected')
            .find('#'+nav[pageid].t4)
            .addClass('subselect');     //leftnav
    }
    catch(err) {
        ...do something with the error...
    }
},100);

...但我真的要检查leftnav元素检查是否适用.

最后,我不禁要说这个"功能"正在处理全局变量.你应该传递navpageid进入函数,以保持封装和你的理智.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有