Javascript:What';如果阻塞或尝试/捕获,则效率更高?
我想听听关于这段代码中什么更有效的其他意见。基本上,在下面的代码中,有一个setInterval循环,在代码在循环中运行之前,我需要满足4个要求。所以在第1节中,我写了一个if语句来检查所有4个。很好 然后我切换到只使用try/catch,我想在try{}中执行的代码。逻辑是,在每个循环期间,都会生成异常,但对于每个无效条件都会抑制异常。在所有条件都为真的最后一个循环中,代码执行并清除间隔 两种方法都有效。我喜欢try/catch方法,因为我需要编写的条件代码较少,而且担心会被破坏。但我担心try/catch的效率非常低,特别是在以100ms运行的setInterval()循环中。其他聪明人对此有什么看法 尝试/抓住Javascript:What';如果阻塞或尝试/捕获,则效率更高?,javascript,try-catch,Javascript,Try Catch,我想听听关于这段代码中什么更有效的其他意见。基本上,在下面的代码中,有一个setInterval循环,在代码在循环中运行之前,我需要满足4个要求。所以在第1节中,我写了一个if语句来检查所有4个。很好 然后我切换到只使用try/catch,我想在try{}中执行的代码。逻辑是,在每个循环期间,都会生成异常,但对于每个无效条件都会抑制异常。在所有条件都为真的最后一个循环中,代码执行并清除间隔 两种方法都有效。我喜欢try/catch方法,因为我需要编写的条件代码较少,而且担心会被破坏。但我担心tr
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全局变量是否包含对象typeof document.getElementById('leftnav')=='object'
文档是否包含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')