javascript 用局部变量来代替全局变量第2/2页

 更新时间:2009年05月29日 20:24:56   作者:  
在JavaScript中,我们应该尽可能的用局部变量来代替全局变量,这句话所有人都知道,可是这句话是谁先说的?

上面的结果是通过对变量执行写操作而得出的,其实我很好奇,读取变量时的情况会不会有什么不同,于是接着做了下面的测试。结果发现,读的速度要比写的速度快一些,但是性能变化的趋势是一致的。

       和上个测试一样,Internet Explorer和Firefox还是最慢的,Opera表现了非常抢眼的性能,而同样的,Chrome和最新版本的Webkit午夜版显示了和作用域深度无关的性能趋势,同样需要注意的是,Firefox 3.1 Beta 2的变量访问时间还是会伴随着深度出现一个奇怪的跳跃。

       在测试的过程中,我发现一个有趣的现象,就是Chrome在访问全局变量的时候会有额外的性能损失。访问全局变量的时间和作用域层数没有关系,但是会比访问同样层数的局部变量的时间多出50%。

       这两个测试可以给我们带来什么启示呢?首先是验证了那个古老的观点,就是要尽可能的使用局部变量。在所有的浏览器下,访问局部变量都比访问跨作用域的变量要快,当然也包括全局变量。下面这几点应该是通过这个测试得出的经验吧:

1、仔细检查函数中所有使用的变量,如果有一个变量不是当前作用域定义的,而且使用了不止一次,那么我们就应该把这个变量保存在局部变量中,而使用这个局部变量来进行读写操作。这样可以帮助我们将作用域外的变量的搜索深度减少到1.这对全局变量尤为重要,因为全局变量总是被放到作用域链的最后位置来搜索。

2、避免使用with语句。因为它会修改执行上下文(Execution Context)的作用域链,在最前面添加一个对象(Variable Object)。这就意味着在执行with的过程中,实际上的局部变量都被移到作用域链上的第二个位置,这会带来性能上的损失。

3、如果你确定一段代码肯定会抛出异常,那么就要避免使用try-catch,因为catch分支在作用域链上的处理方法和with是一样的。但try分支的代码是没有性能损失的,所以还是建议用try-catch来捕获那些不可预知的错误。

       如果你想围绕这个话题展开更多的讨论,我在上个月的 Mountain View JavaScript Meetup 中曾经发表了一个小演讲。可以在SlideShare上下载 幻灯片,或者观看聚会的 完整视频,我的演讲大概从11分钟左右时开始。

译者笔记
大家如果在阅读本文的过程中,有什么疑惑,建议延伸阅读以下两篇文章:
1、Richie写的《JavaScript对象模型-执行模型
2、《ECMA-262第三版》,主要看看第十章,就是执行上下文(Execution Context)那张,本文提到的名词在那里都有详细的解释。

       在最后的时候,Nicholas提到一个Mountain View JavaScript Meetup,Meetup那个网站其实就是一个各种现实世界活动的组织网站,需要翻墙才能访问,住在California真幸福,有那么多的好活动可以参加,呵呵。

相关文章

  • JavaScript计时器示例分析

    JavaScript计时器示例分析

    这篇文章主要介绍了JavaScript计时器示例分析,需要的朋友可以参考下
    2015-02-02
  • JS实现自定义状态栏动画文字效果示例

    JS实现自定义状态栏动画文字效果示例

    这篇文章主要介绍了JS实现自定义状态栏动画文字效果,涉及javascript结合时间函数动态设置IE状态栏文字显示效果相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Javascript判断文件是否存在(客户端/服务器端)

    Javascript判断文件是否存在(客户端/服务器端)

    这篇文章主要介绍了Javascript判断文件是否存在的方法适用于客户端、服务器端,远程文件,示例代码如下,需要的朋友可以参考下
    2014-09-09
  • 使用javascript函数编写简单银行取钱存钱流程

    使用javascript函数编写简单银行取钱存钱流程

    本文通过实例代码给大家讲解了使用javascript函数编写简单银行取钱存钱流程,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • 鼠标事件延时切换插件

    鼠标事件延时切换插件

    为了防止误操作,很多时候需要对鼠标滑过触发的事件进行延时处理。网易首页的选项卡好几年之前就添加了这个特性,当时我记得是采用150毫秒作为触发基准
    2011-03-03
  • uniapp项目实践之全局公共组件样式及方法使用示例详解

    uniapp项目实践之全局公共组件样式及方法使用示例详解

    这篇文章主要为大家介绍了uniapp项目实践之全局公共组件样式及方法使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 微信小程序webview与h5通过postMessage实现实时通讯的实现

    微信小程序webview与h5通过postMessage实现实时通讯的实现

    这篇文章主要介绍了微信小程序webview与h5通过postMessage实现实时通讯的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • javascript实现贪吃蛇经典游戏

    javascript实现贪吃蛇经典游戏

    这篇文章主要为大家详细介绍了javascript实现贪吃蛇经典游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • javascript实现评分功能

    javascript实现评分功能

    这篇文章主要为大家详细介绍了javascript实现评分功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 详解JavaScript的this指向和绑定

    详解JavaScript的this指向和绑定

    JavaScript 中的 new、bind、call、apply 实际这些都离不开 this,因此本文将着重讨论 this,在此过程中分别讲解其他相关知识点。
    2020-09-09

最新评论