我对这段代码中效率更高的其他一些看法很感兴趣.基本上在下面的代码中,有一个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语句昂贵得多.
异常应该用于特殊情况下(即你不要指望正常发生的事情).你不应该,在一般情况下,使用异常捕捉的东西,你可以用一个if语句测试.
另外,据我所知,异常比if语句昂贵得多.
使用if语句.我不知道TRY/CATCH的开销是多少,但我怀疑它比评估布尔表达式要大得多.要点击TRY/CATCH,你必须:执行一个语句,生成一个错误[带有相关的开销],记录错误(大概),做一个堆栈跟踪(大概),并移回代码.此外,如果您必须调试这些行附近的代码,真正的错误可能会被您的TRY/CATCHing混淆.
此外,它是对TRY/CATCH的误用,并且可能使您的代码更难以阅读.假设您为更长或更多混淆的案例执行此操作?你的捕获量最终会在哪里?
这称为异常处理
编辑:如下所述,如果实际导致异常,则只会获取运行时性能命中.
其他答案是正确的,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元素检查是否适用.
最后,我不禁要说这个"功能"正在处理全局变量.你应该传递nav
并pageid
进入函数,以保持封装和你的理智.