JavaScript 是解释性的语言,他的执行速度要大大慢于编译性语言。
JavaScript 比编译型的 C 慢 5000 倍;
比解释型的 Java 慢 100 倍;
比解释型的 Perl 慢 10 倍;
不过我们可以坐一些简单的事情来提高 JavaScript代码的性能。
1.关注范围
范围可以被认为是某个变量的存在空间。浏览器的 JavaScript 的默认的范围(全局)是 window。在window范围中创建的变量只在页面从浏览器中卸载后才
会销毁。而你定义的每个函数都是在全局范围下的另一个范围中。在函数中创建的所有变量都只存在于函数范围内,函数执行完毕时就销毁。
可以认为JavaScript 的范围是一个树状层次。引用变量时, JavaScript 解释程序先在最近的范围内查找其是否存在。如果没有,就到上一层次中查找,如此
进行,直到 window 范围。如果在 window 范围内也没有发现变量,则报告错误。
每次解释程序到另一个范围内搜索变量,都会影响执行速度。本地范围内的变量比全局变量执行起来更快。解释程序在树中要走的距离越短,脚本运行地越快。
考虑如下例子:
var sMyF = "Nicholas";
function fn1(){
alert(sMyF);
}
function fn2(){
var sMyM = "Zakas";
fn1();
}
function fn3(){
var sMyL = "C";
fn2();
}
fn3();
调用最后一行的 fn3() 时,创建了如下的范围树:
(window)
|
|
|------MyF = "Nicholas"
|
|
|------fn3()
|
|
|------MyM = "Zakas"
|
|
|-------fn2()
|
|
|-------MyL = "C"
|
|
|--------fn1()
函数fn3()调用fn2(),而fn2()调用了fn1()。函数fn1()又访问了window级别的变量 sMyF,为定位这个变量,解释程序必须不断向上查找整个范围树,直到window范围。这花费了很多时间。所以必须找一个优化执行速度的方法。
(1)使用局部变量
在函数中,总是使用var 语句来定义变量。无论何时使用var,都会在当前的范围内创建一个局部变量。如果直接使用这个变量而不事先用var进行声明,则变量会创建在window范围内,也就说每次使用这个变量,解释程序都要搜索整个范围树。
例如,不推荐这种方法。
function sayFirstName(){
aMyF = "Nicholas"; // 没有使用 var 声明
alert(aMyF);
}
在这个函数中,对变量 aMyF的赋值没有使用var;变量就被创建在了window 范围内。
优化JavaScript 之执行时间
最新推荐文章于 2024-07-12 16:27:40 发布