这段Javascript效率低下吗?

时间:2009-12-21 03:38:21

标签: javascript

我只是想知道这段Javascript是否会减慢我的网站速度:

$(function(){
 var realLink = location.href;
 $( "#nav a" ).each(
  function( intIndex ){
   String.prototype.startsWith = function(str){
    return (this.indexOf(str) === 0);
   }
   var pageLink = $(this).attr("href");

   if ( realLink.startsWith(pageLink) )
    $(this).parent().addClass("active");   
  }
 );
});

它只循环了大约5-7次,而且我没有很多Javascript循环经验。

5 个答案:

答案 0 :(得分:5)

此代码段没有任何内在错误,只是您不断创建并在循环中为String.prototype.startsWith分配函数。当然,这是一项不必要的工作,至少应该是:

$(function(){
 var realLink = location.href;
 String.prototype.startsWith = function(str){
   return (this.indexOf(str) === 0);
 };
 $( "#nav a" ).each(
  function( intIndex ){
   var pageLink = $(this).attr("href");
   if ( realLink.startsWith(pageLink) )
    $(this).parent().addClass("active");   
  }
 );
});

我也认为那里不需要intIndex参数。它不会在函数的任何地方使用。

答案 1 :(得分:2)

您可以通过将代码更改为:

来使代码执行得更好
String.prototype.startsWith = function(str){
    return(this.indexOf(str) == 0);
}

$(function(){
    var realLink = location.href;

    $('#nav a').each(function(intIndex){
        var pageLink = $(this).attr("href");
        if(realLink.startsWith(pageLink))
            $(this).parent().addClass("active");
        });
});

它只是突破了startsWith()的定义,所以你不要为循环的每次迭代定义它。

答案 2 :(得分:1)

尝试使用Firebug's Profiling Feature衡量脚本的效果。

答案 3 :(得分:0)

应该没问题。如果#nav元素不包含数千个链接,那么您应该没问题。

安装适用于Firefox的Firebug,您可以执行配置文件运行。它会告诉你它在每个函数中花费了多少时间。我猜这种情况将以毫秒为单位。

答案 4 :(得分:0)

如果你在Sizzle中使用^ =运算符(在这种情况下是jQuery),它基本上意味着“从这个值开始”。试试这个:

$(function(){
   $( '#nav a:not( [href^="' + startsWith + '"] )' ).addClass( 'active' );
});

并将startsWith更改为您选择的变量。