为了测试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函数,这些函数在实际开发中非常常见且实用。 1. `console.log()` 这是开发者调试代码时最常用的函数之一。它用于在浏览器的控制台输出信息,帮助开发者查看程序执行过程中...
在这个例子中,匿名函数用于计算平均值,当函数执行完后,不再需要它,因此没有保留它的必要。 **函数作为值** 意味着函数可以像任何其他数据类型(如字符串、数字或数组)一样被处理。你可以将函数作为参数传递给...
7. **尾调用优化**:JavaScript引擎对尾调用的优化使得递归函数的执行效率得以提高,避免了栈溢出的问题。在函数式编程中,递归是常见的一种解决方式。 8. **数据不可变性**:数据不可变性意味着一旦创建,对象就不...
例如,使用箭头函数、模板字符串、const和let代替var,以及使用数组方法(如map、filter、reduce)等,都可以提高代码执行效率。 总结,优化JavaScript加载和执行效率涉及多个方面,包括正确选择脚本位置、使用异步...
柯里化的优点在于可以提高函数的执行效率和代码的可读性。 例如,我们可以将 `add` 函数柯里化为 `addX` 函数,如下所示: ```javascript function add(x, y) { return x + y } //柯里化之前 add(1, 2) // 3 //...
无论是通过函数自我修改还是通过IIFE,惰性载入都显著地减少了函数执行路径的长度,提高了函数的执行效率。特别是在大型项目中,这种技术能够明显提升性能,减少不必要的计算。 需要注意的是,惰性载入虽然提高了...
JavaScript 函数 JavaScript 函数是一种编程结构,用于执行特定的任务并返回结果。函数可以重复使用,因此您只需编写一...函数是 JavaScript 编程中非常重要的一部分,掌握函数的使用可以大大提高编程效率和代码质量。
`eval`是一个非常危险且效率低下的函数,它能够执行字符串形式的JavaScript代码,但这样的代码无法被编译器优化,执行效率极低。现在一般不推荐使用`eval`,如果需要动态执行代码,可以使用`new Function`或`...
JavaScript,作为一种广泛应用于...这个“JavaScript 函数速查”资源可以帮助开发者快速定位所需函数,提高编程效率。在日常开发中,建议结合实际案例进行学习,不断实践和巩固,以达到熟练掌握JavaScript函数的目的。
**JavaScript函数查询CHM文件:** `JavaScript参考手册.chm` 是一个帮助文件,包含JavaScript的所有函数和对象的详细信息。CHM(Compiled HTML Help)是一种Microsoft提供的帮助文件格式,将HTML页面编译成单一文件...
JavaScript函数是一种能够封装特定任务的代码块,可以被重复调用以执行这些任务。这些函数可以通过接收参数来处理输入数据,并且通常会返回一个结果。这种机制不仅提高了代码的可重用性,也使得代码结构更为清晰。 ...
预编译的主要目的是提升程序的执行效率。在这个阶段,JavaScript引擎会处理函数声明和变量声明,提前创建相应的函数对象和变量对象,并将变量初始化为`undefined`。 **示例代码**: ```javascript function Hello()...
本文将详细探讨JavaScript函数的特性与应用实践。 首先,JavaScript函数是一种对象,这使得它们拥有对象的所有属性和方法。函数对象连接到Function.prototype,而这个对象本身又连接到Object.prototype。在创建函数...
通过C#封装JavaScript函数,可以有效地管理和优化网页的客户端逻辑,提高开发效率。在实际项目中,可以根据需求进一步扩展这些函数,以满足更多复杂的业务场景。同时,这样的封装方式也有利于团队协作,降低代码学习...
代码复用是软件开发中一个重要的概念,指的是将已经编写的代码重复使用,以减少代码冗余和提高开发效率。作者分享了自己的经验,如何从代码复用角度来看待 JavaScript 闭包和异步的关系。 柯里化 柯里化是函数式...
总之,《JavaScript函数式编程指南1》是一本实用性极强的书籍,适合希望提高代码质量和设计能力的JavaScript开发者阅读。通过深入理解和应用书中的知识,开发者能够编写出更简洁、更健壮的代码,提升整体的开发效率...
高阶函数是函数式编程的核心概念之一,在JavaScript中尤为重要,因为JavaScript函数是"一等公民"。 ### 知识点一:高阶函数定义 高阶函数指的是可以接受一个或多个函数作为参数的函数,也可以返回一个函数。这样的...
【JavaScript函数详解】 JavaScript函数是编程中不可或缺的部分,它们是一段可重复使用的代码,能够实现特定功能。...通过良好的函数设计,可以提高代码的复用性和模块化程度,减少代码冗余,提升开发效率。
本压缩包“一些公用的javascript函数”包含了程序员在日常工作中经常使用的实用JavaScript函数,这些函数对于提升代码效率、简化编程任务具有重要意义。下面我们将深入探讨其中可能包含的知识点。 1. **函数定义与...
Function()构造函数创建的函数不遵循典型的作用域规则,总是被当作顶级函数执行。 在匿名函数的代码模式方面,存在几种不同的写法。错误模式下,匿名函数的声明和调用不被支持,会导致语法错误。函数字面量模式则是...