Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个JavaScript可以优化吗?_Javascript_Jquery_Performance_Refactoring - Fatal编程技术网

这个JavaScript可以优化吗?

这个JavaScript可以优化吗?,javascript,jquery,performance,refactoring,Javascript,Jquery,Performance,Refactoring,这个JS将在有很多字段的页面上执行。你能看到如何提高这段代码的速度吗?如果是,你能解释一下你发现了什么吗 var _TextInputs = null; function GetTextInputs() { if (_TextInputs == null) { _TextInputs = jq('input[type=text]'); } return _TextInputs; } var _Spans = null; function Get

这个JS将在有很多字段的页面上执行。你能看到如何提高这段代码的速度吗?如果是,你能解释一下你发现了什么吗

var _TextInputs = null;
function GetTextInputs()
{
    if (_TextInputs == null)
    {
        _TextInputs = jq('input[type=text]');
    }

    return _TextInputs;
}

var _Spans = null;
function GetSpans()
{
    if (_Spans == null)
    {
        _Spans = jq('span');
    }

    return _Spans;
}


function UpdateRate(ratefield, name)
{
    GetTextInputs().filter('[' + name + ']').each(function()
    {
        this.value = FormatCurrencyAsString(FormatCurrencyAsFloat(ratefield.value));
        CalculateCharge(name.replace('Rate', ''), jq(this).attr(name));
    });
}

function CalculateCharge(name, activity_id)
{
    var inputs = GetTextInputs();
    var bill_field = inputs.filter('[' + name + 'Bill=' + activity_id + ']');
    var rate_field = inputs.filter('[' + name + 'Rate=' + activity_id + ']');
    var charge_field = GetSpans().filter('[' + name + 'Charge=' + activity_id + ']'); 

    charge_field.text(FormatCurrencyAsString(FormatCurrencyAsFloat(bill_field.val()) * FormatCurrencyAsFloat(rate_field.val())));
}

我可以看到,您到处都在使用属性过滤器,例如:

_TextInputs = jq('input[type=text]');

inputs.filter('[' + name + 'Bill=' + activity_id + ']');
属性过滤器很有用,但与更直接的类或ID选择器相比,并不特别“快”。我看不到任何标记,因此我只能建议您使用更多ID和类,例如:

jq('input.textInput');
而不是:

jq('input[type=text]');
你可以:

  • 将每个
    替换为
  • val()
    替换为
    .value
    (只要这些字段是纯文本字段就可以了)
  • 按类而不是按名称/类型访问元素
  • attr()
    替换为普通属性访问;e、 g.:
    this.attr(name)
    -->
    this.name
这些都是相当不引人注目的变化,主要由于减少了函数调用,这些变化应该会加快速度


如果元素是静态的(即在应用程序生命周期内未修改),则不要在每次函数调用中查询元素。相反,将它们存储在循环之外。

有点离题,但我使用并推荐。这本书包含了Scriptaculous的创建者提出的大量令人敬畏的JS优化建议。此外,还附带了一个名为DOM Monster的工具,该工具有助于跟踪性能瓶颈——这是对Firebug的一个极好的赞扬,因为它实际上是在DOM中跟踪基于启发式和DOM复杂性的低效率情况。

Firebug有一个很棒的javascript分析器。这将告诉你实际花在哪里的时间。Firefox执行的非常快。问题在于IE.IE 8还内置了一个很棒的JavaScript分析器。按F12。@harpo:如果你吐出答案,我会给你的。你的评论比你想象的要有用得多。在Firebug探查器和一些(回想起来)明显的临时变量之间,我成功地将这段代码设置为“snappier”。谢谢