`
angie_hawk7
  • 浏览: 48159 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

提高javascript函数的执行效率

阅读更多
为了测试javascript函数在执行的过程中,对局部变量的赋值开销以及缓存全局变量或者dom属性(方法)的开销,特别写了如下三个简单的测试函数:

函数一:正常使用,循环10000次调用document.getElementsByTagName
function test1(){
  for(var i=0;i<10000;i++){
  var el = document.getElementsByTagName('div');
  }
};

函数二:缓存document对象,作为减少函数调用中搜索作用域链的开销,但增加了一个局部变量的赋值开销

_d = document,循环的次数仍然是10000次。
function test2(){
  var el,_d = document;
  for(var i=0;i<10000;i++){
        el = _d.getElementsByTagName('div');
  }
};

函数三:缓存dom的方法进行调用在IE6下非常耗时,是三个函数中最慢的,并且在FF&chrome马上挂死掉.

function test3(){
  var el,_d = document.getElementsByTagName;
  for(var i=0;i<10000;i++){
  el = _d('div');
  }
};

下面是在IE6和FireFox3.0.14想进行测试的时间开销:

IE6下:

                           test1()                       test2()                      test3()

第一次:           406ms                      219ms                      1250ms

第二次:          516ms                       250ms                      1266ms

第三次:          469ms                       250ms                       1266ms

第四次:          453ms                       250ms                       1250ms

第五次:          422ms                       203ms                      1312ms

第六次:          437ms                       219ms                       1235ms

第七次:          422ms                       219ms                       1250ms

第八次:          454ms                        265ms                       1250ms

第九次:          437ms                       219ms                         1281ms

第十次:          406ms                        219ms                         1250ms

FireFox下:

                           test1()                       test2()                      test3()

第一次:           229ms                     156ms                      -

第二次:           226ms                      184ms                     -

第三次:            248ms                    181ms                      -

第四次:            184ms                     159ms                     -

第五次:             215ms                     180ms                    -

第六次:            210ms                      177ms                    -

第七次:            196ms                       169ms                   -

第八次:            202ms                        175ms                  -

第九次:             192ms                        175ms                 -

第十次:             202ms                        175ms                 -

从上面的测试数据可以得出比较重要的结论:

1,FireFox在dom的操作效率上确实比IE要快了许多,这点毫无疑问的。

2,在一个函数的执行过程中,如果对dom存在多次的引用,可以通过缓存成函数的局部变量来缩短搜索scopechain的开销,加快函数调用的执行效率,但这里也要考虑局部变量赋值的开销情况。

3,在IE6下发现缓存document.getElementById或者document.getElementsByTagName,然后进行调用的执行效率更差,并且该缓存的方法在Firefox和chrome下无法执行,出现类型错误等,具体原因主要是Firefox等跟IE对host object的实现不一样导致的,而ECMA对host object没有明确的规定,经过测试发现:

IE下:

var fn = document.getElementsByTagName;

fn('divid'); //可以正常进行调用

alert(typeof fn); //输出object类型,而不是function类型

fn.call(document, 'divid');//无法调用,提示没有call方法

fn.apply(document, ['divid']);//无法调用,提示没有apply方法

Firefox下:

var fn = document.getElementsByTagName;

fn('divid'); //无法进行调用,但下面的方法可以:

//主要原因是把document的方法作为一个引用保持到一个全局变量导致this指针变成了global对象,因此进行调用的时候

//提示非法类型错误

fn.call(document, 'divid');

alert(typeof fn); //输出function类型,而不是object类型

fn.call(document, 'divid'); //可以正常使用

fn.apply(document, ['divid']); //可以正常使用

4:对函数进行引用保存后再调用的时候,要主要可能导致内部的this指针“漂移”的问题,特别是之前是一个对象的方法,而后保存成一个全局的变量,而后者进行调用的时候,实际上this指针跟之前的已经不一样了。

5,对dom中的方法,IE和Firefox等存在较多的差异,Firefox相对更加标准,IE对dom的方法和属性的类型均是object,对应的方法也可能不存在对应的call和apply方法。(注意:ECMA-262规范对host object的类型等没有明确的规定)
[img]

[/img]



  • 大小: 71.8 KB
分享到:
评论

相关推荐

    几个常用javascript函数

    本篇文章将深入探讨几个常用的JavaScript函数,这些函数在实际开发中非常常见且实用。 1. `console.log()` 这是开发者调试代码时最常用的函数之一。它用于在浏览器的控制台输出信息,帮助开发者查看程序执行过程中...

    javascript 函数式编程

    在这个例子中,匿名函数用于计算平均值,当函数执行完后,不再需要它,因此没有保留它的必要。 **函数作为值** 意味着函数可以像任何其他数据类型(如字符串、数字或数组)一样被处理。你可以将函数作为参数传递给...

    JavaScript 函数式编程 (英文版)

    7. **尾调用优化**:JavaScript引擎对尾调用的优化使得递归函数的执行效率得以提高,避免了栈溢出的问题。在函数式编程中,递归是常见的一种解决方式。 8. **数据不可变性**:数据不可变性意味着一旦创建,对象就不...

    JavaScript提高加载和执行效率的方法

    例如,使用箭头函数、模板字符串、const和let代替var,以及使用数组方法(如map、filter、reduce)等,都可以提高代码执行效率。 总结,优化JavaScript加载和执行效率涉及多个方面,包括正确选择脚本位置、使用异步...

    javascript函数式编程函数柯里化,惰性函数,递归,纯函数.docx

    柯里化的优点在于可以提高函数的执行效率和代码的可读性。 例如,我们可以将 `add` 函数柯里化为 `addX` 函数,如下所示: ```javascript function add(x, y) { return x + y } //柯里化之前 add(1, 2) // 3 //...

    利用函数的惰性载入提高javascript代码执行效率

    无论是通过函数自我修改还是通过IIFE,惰性载入都显著地减少了函数执行路径的长度,提高了函数的执行效率。特别是在大型项目中,这种技术能够明显提升性能,减少不必要的计算。 需要注意的是,惰性载入虽然提高了...

    JavaScript 函数.pdf

    JavaScript 函数 JavaScript 函数是一种编程结构,用于执行特定的任务并返回结果。函数可以重复使用,因此您只需编写一...函数是 JavaScript 编程中非常重要的一部分,掌握函数的使用可以大大提高编程效率和代码质量。

    Javascript执行效率小结.pdf

    `eval`是一个非常危险且效率低下的函数,它能够执行字符串形式的JavaScript代码,但这样的代码无法被编译器优化,执行效率极低。现在一般不推荐使用`eval`,如果需要动态执行代码,可以使用`new Function`或`...

    JavaScript 函数速查

    JavaScript,作为一种广泛应用于...这个“JavaScript 函数速查”资源可以帮助开发者快速定位所需函数,提高编程效率。在日常开发中,建议结合实际案例进行学习,不断实践和巩固,以达到熟练掌握JavaScript函数的目的。

    javascript(函数查询chm+语法pdf)

    **JavaScript函数查询CHM文件:** `JavaScript参考手册.chm` 是一个帮助文件,包含JavaScript的所有函数和对象的详细信息。CHM(Compiled HTML Help)是一种Microsoft提供的帮助文件格式,将HTML页面编译成单一文件...

    JavaScript函数-深入解析与使用指南(很详细)

    JavaScript函数是一种能够封装特定任务的代码块,可以被重复调用以执行这些任务。这些函数可以通过接收参数来处理输入数据,并且通常会返回一个结果。这种机制不仅提高了代码的可重用性,也使得代码结构更为清晰。 ...

    JavaScript的执行过程详细研究

    预编译的主要目的是提升程序的执行效率。在这个阶段,JavaScript引擎会处理函数声明和变量声明,提前创建相应的函数对象和变量对象,并将变量初始化为`undefined`。 **示例代码**: ```javascript function Hello()...

    JavaScript函数的特性与应用实践深入详解

    本文将详细探讨JavaScript函数的特性与应用实践。 首先,JavaScript函数是一种对象,这使得它们拥有对象的所有属性和方法。函数对象连接到Function.prototype,而这个对象本身又连接到Object.prototype。在创建函数...

    asp.net开发常用javascript函数封装(c#)

    通过C#封装JavaScript函数,可以有效地管理和优化网页的客户端逻辑,提高开发效率。在实际项目中,可以根据需求进一步扩展这些函数,以满足更多复杂的业务场景。同时,这样的封装方式也有利于团队协作,降低代码学习...

    JavaScript 函数式编程精要 —— 签约作者安东尼知识分享

    代码复用是软件开发中一个重要的概念,指的是将已经编写的代码重复使用,以减少代码冗余和提高开发效率。作者分享了自己的经验,如何从代码复用角度来看待 JavaScript 闭包和异步的关系。 柯里化 柯里化是函数式...

    JavaScript函数式编程指南1

    总之,《JavaScript函数式编程指南1》是一本实用性极强的书籍,适合希望提高代码质量和设计能力的JavaScript开发者阅读。通过深入理解和应用书中的知识,开发者能够编写出更简洁、更健壮的代码,提升整体的开发效率...

    JAVASCRIPT函数之高阶函数.pdf

    高阶函数是函数式编程的核心概念之一,在JavaScript中尤为重要,因为JavaScript函数是"一等公民"。 ### 知识点一:高阶函数定义 高阶函数指的是可以接受一个或多个函数作为参数的函数,也可以返回一个函数。这样的...

    第三章JavaScript函数.docx

    【JavaScript函数详解】 JavaScript函数是编程中不可或缺的部分,它们是一段可重复使用的代码,能够实现特定功能。...通过良好的函数设计,可以提高代码的复用性和模块化程度,减少代码冗余,提升开发效率。

    一些公用的javascript函数

    本压缩包“一些公用的javascript函数”包含了程序员在日常工作中经常使用的实用JavaScript函数,这些函数对于提升代码效率、简化编程任务具有重要意义。下面我们将深入探讨其中可能包含的知识点。 1. **函数定义与...

    Javascript的匿名函数讲解

    Function()构造函数创建的函数不遵循典型的作用域规则,总是被当作顶级函数执行。 在匿名函数的代码模式方面,存在几种不同的写法。错误模式下,匿名函数的声明和调用不被支持,会导致语法错误。函数字面量模式则是...

Global site tag (gtag.js) - Google Analytics