Javascript:What';如果阻塞或尝试/捕获,则效率更高?

Javascript:What';如果阻塞或尝试/捕获,则效率更高?,javascript,try-catch,Javascript,Try Catch,我想听听关于这段代码中什么更有效的其他意见。基本上,在下面的代码中,有一个setInterval循环,在代码在循环中运行之前,我需要满足4个要求。所以在第1节中,我写了一个if语句来检查所有4个。很好 然后我切换到只使用try/catch,我想在try{}中执行的代码。逻辑是,在每个循环期间,都会生成异常,但对于每个无效条件都会抑制异常。在所有条件都为真的最后一个循环中,代码执行并清除间隔 两种方法都有效。我喜欢try/catch方法,因为我需要编写的条件代码较少,而且担心会被破坏。但我担心tr

我想听听关于这段代码中什么更有效的其他意见。基本上,在下面的代码中,有一个setInterval循环,在代码在循环中运行之前,我需要满足4个要求。所以在第1节中,我写了一个if语句来检查所有4个。很好

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

两种方法都有效。我喜欢try/catch方法,因为我需要编写的条件代码较少,而且担心会被破坏。但我担心try/catch的效率非常低,特别是在以100ms运行的setInterval()循环中。其他聪明人对此有什么看法

尝试/抓住

var intvar=setInterval(函数(){
试试{
清除间隔(intvar);
jQuery('#'+nav[pageid].t1+'>a').replaceWith(jQuery(''+jQuery('.'+jQuery'+nav[pageid].t1+'>a').text()++');
//设置导航的显示类别
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);
IF块

var intvar=setInterval(函数(){
if(typeof jQuery=='function'&&typeof nav=='object'&&typeof pageid!='undefined'&&typeof document.getElementById('leftnav')=='object'){
清除间隔(intvar);
jQuery('#'+nav[pageid].t1+'>a').replaceWith(jQuery(''+jQuery('.'+jQuery'+nav[pageid].t1+'>a').text()++');
//设置导航的显示类别
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);

异常应用于异常情况(即您不希望正常发生的事情)。通常,您不应该使用异常来捕获可以使用if语句进行测试的内容


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

我将编写以下代码:

var startTime = (new Date()).getTime();
for (var i=0; i < 1000; ++i) intvar();
var endTime = (new Date()).getTime();
alert("Took " + ((endTime - startTime) / 1000.0) " seconds");
var startTime=(新日期()).getTime();
对于(var i=0;i<1000;++i)intvar();
var endTime=(新日期()).getTime();
警报(“耗时”+((结束时间-开始时间)/1000.0)“秒”);
然后我会尝试两个版本的intvar,看看哪个运行得更快。我会自己做,但我没有你做的页面布局,所以我的代码无法工作


一些风格注释-似乎没有必要测试
jQuery
是否是一个函数。如果不是,您的网页可能会被弄乱,因此不运行
intvar
代码对您没有帮助。如果您很少期望抛出异常,我会使用try/catch。

使用If语句。我不知道TRY/CATCH的开销是多少,但我怀疑这远远大于计算布尔表达式。要点击TRY/CATCH,您必须:执行一条语句,生成一个错误[以及相关的开销],记录错误(大概),进行堆栈跟踪(大概),然后移回代码中。此外,如果您必须在这些行附近调试代码,那么真正的错误可能会与您正在尝试/捕获的内容混淆

此外,这是对TRY/CATCH的滥用,会使代码更难阅读。假设您对更长或更模糊的情况执行此操作?你的收获会在哪里结束

这被称为


编辑:正如下面所评论的,只有在实际导致异常的情况下,您才会受到运行时性能的影响。

对于所提供的示例,您将try/catch包装在无论如何都应该运行的代码块周围(除非发生了可怕的事情),使用try/catch是一种很好的形式。给你一个类比:你总是在if语句中测试“天空是蓝色的吗?”还是用try/catch来包装它,只有当天空恰好变绿时才会触发

如果您处理的是用户提供的输入,或者由于代码中发生了其他情况,函数不存在的可能性更大,请使用If语句方法


请记住,如果您没有触发异常,那么代码之间就没有任何展开或回溯。在本例中,仅当出现错误(jQuery缺失或类似情况)时才会执行catch,但是if语句方法在对该函数的每次调用中都会进行求值-您不应该做比必须做的更多的工作。

其他答案是正确的,
try/catch
用于特殊情况和错误处理<代码>如果条件用于程序逻辑。“哪个更快?”是个错误的问题

一个很好的经验法则,如果你什么都不做,但有例外,这可能不是例外

为了弄清楚该使用哪一个,让我们分析一下您的if条件

  • typeof jQuery==“function”
    是否定义了jQuery()函数
  • typeof nav==“object”
    nav全局变量是否包含对象
  • 页面ID的类型!='未定义“是否定义了pageid全局变量
  • typeof document.getElementById('leftnav')=='object'
    文档是否包含leftnav元素
  • 第一个显然是个例外。如果没有jQuery()函数,您将一事无成

    第二个也是例外。没有导航物体,你哪儿也去不了

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

    第四个可能是逻辑。“仅当存在leftnav元素时才运行此代码”。很难说,因为代码的其余部分没有引用leftnav元素!只有评论才有,这是一个危险信号。
    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('<span>'+jQuery('#'+nav[pageid].t1+'>a').text()+'</span>'));
    
        //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);
    
    var startTime = (new Date()).getTime();
    for (var i=0; i < 1000; ++i) intvar();
    var endTime = (new Date()).getTime();
    alert("Took " + ((endTime - startTime) / 1000.0) " seconds");
    
    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('<span>'+jQuery('#'+nav[pageid].t1+'>a').text()+'</span>'));
    
            //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);
    
    throw new BusinessValidationException(TAG, 'Reason for the validation');
    
    if (!checkValidityBusinessRule()) 
        // doSomething 
    
    if(typeof jQuery == 'function' && typeof nav == 'object' && typeof pageid != 'undefined' && typeof document.getElementById('leftnav') == 'object')