首页 >

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

web前端|js教程javascript 用局部变量来代替全局变量第1/2页【javascript】
javascript,局部变量,全局变量
web前端-js教程
为什么要这么做?有什么根据么?不这么做,对性能到底能带来多大的损失?本文就来探讨这些问题的答案,从根本上了解变量的读写性能都和哪些因素有关。
著作权声明
本文译自 Nicholas C. Zakas 于2009年2月10日在个人网站上发表的《JavaScript Variable Performance》。原文是唯一的正式版,本文是经过原作者(Nicholas C. Zakas)授权的简体中文翻译版(Simplified Chinese Translation)。译者(明达)在翻译的准确性上做了大量的努力,并承诺译文的内容完全忠于原文,但可能还是包含疏漏和不妥之处,欢迎大家指正。译注的内容是非正式的,仅代表译者个人观点。
惠农网源码,vscode中beauty,ubuntu 衍生,tomcat路径查看,c# sqlite orm,网页导出word文档插件下载,前端框架的树是什么,游戏爬虫什么意思,php 文件夹下所有文件,seo培训一年赚多少seo顾问,焊接设备器材网站源码,网页状态栏特效 失效,织梦手机模板不存在lzw
以下是对原文的翻译
在如何提高JavaScript性能这个问题上,大家最常听到的建议应该就是尽量使用局部变量(local variables)来代替全局变量(global variables)。在我从事Web开发工作的九年时间里,这条建议始终萦绕在我的耳边,并且从来没有质疑过,而这条建议的基础,则来自于 JavaScript处理作用域(scoping)和标识符解析(identifier resolution)的方法。
淘宝宝贝发布源码,ubuntu有迅雷么,python爬虫房信息,php {},SEO技术图谱lzw
首先我们要明确,函数在JavaScript中具体表现为对象,创建一个函数的过程,其实也就是创建一个对象的过程。每个函数对象都有一个叫做 [[Scope]]的内部属性,这个内部属性包含创建函数时的作用域信息。实际上,[[Scope]]属性对应的是一个对象(Variable Objects)列表,列表中的对象是可以从函数内部访问的。比如说我们建立一个全局函数A,那么A的[[Scope]]内部属性中只包含一个全局对象(Global Object),而如果我们在A中创建一个新的函数B,那么B的[[Scope]]属性中就包含两个对象,函数A的Activation Object对象在前面,全局对象(Global Object)排在后面。
cc防火墙源码,vscode代码重构插件,ubuntu打开文件夹,tomcat不编译jsp,github sqlite,网页设计中有哪些导航,sql数据库语法,深圳联通云服务器,微信自定义分享插件,百度用的什么前端框架,外包爬虫,php代码格式化,aso与seo,springboot访问数据,html 常用行级标签,免费建学校网站,网页上传文件插件,wordpress 商品 模板,asp后台登陆会自动退出,app启动页面 代码,asp 报修管理系统,asp小说程序lzw
当一个函数被执行的时候,会自动创建一个可以执行的对象(Execution Object),并同时绑定一个作用域链(Scope Chain)。作用域链会通过下面两个步骤来建立,用于进行标识符解析。

首先将函数对象[[Scope]]内部属性中的对象,按顺序复制到作用域链中。

其次,在函数执行时,会创建一个新的Activation Object对象,这个对象中包含了this、参数(arguments)、局部变量(包括命名的参数)的定义,这个Activation Object对象会被置于作用域链的最前面。

在执行JavaScript代码的过程中,当遇到一个标识符,就会根据标识符的名称,在执行上下文(Execution Context)的作用域链中进行搜索。从作用域链的第一个对象(该函数的Activation Object对象)开始,如果没有找到,就搜索作用域链中的下一个对象,如此往复,直到找到了标识符的定义。如果在搜索完作用域中的最后一个对象,也就是全局对象(Global Object)以后也没有找到,则会抛出一个错误,提示用户该变量未定义(undefined)。这是在ECMA-262标准中描述的函数执行模型和标识符解析(Identifier Resolution)的过程,事实证明,大部分的JavaScript引擎确实也是这样实现的。需要注意的是,ECMA-262并没有强制要求采用这种结构,只是对这部分功能加以描述而已。

了解标识符解析(Identifier Resolution)的过程以后,我们就能明白为什么局部变量的解析速度要比其他作用域的变量快,主要是由于搜索过程被大幅缩短了。但是,具体会快多少呢?为了回答这个问题,我模拟了一系列的测试,来测试不同作用域深度中变量的性能。

第一个测试是向一个变量中写入一个最简单的值(这里使用字面量的数值1),结果如下图显示,很有趣:

从结果中不难看出,当标识符解析的过程需要进行深度搜索时,会伴随性能损失,而且性能损失的程度会随着标识符深度的增加而递增。意料之中的是,Internet Explorer表现的是最差的(但公平的说,IE 8还是有一些改善的)。值得注意的是,这里有一些例外情况,Google Chrome和最新的WebKit午夜版在访问变量的时间保持得很稳定,不会随着作用域深度的递增而增长。当然,这应该归功于它们所使用的下一代 JavaScript引擎,V8和SquirrelFish。这些引擎在执行代码时进行了优化,而且很明显,这些优化使访问变量的速度比以往更快。 Opera表现的也很不错,比IE、Firefox和当前版本的Safari要快的多,但比基于V8和Squirrelfish的浏览器要慢。 Firefox 3.1 Beta 2的表现有点出人意料,对于局部变量执行的效率非常高,但随着作用域层数的增加,效率便大打折扣。需要注意的是,我这里使用的都是默认设置,也就是说 Firefox是没有开启Trace功能的。


javascript 用局部变量来代替全局变量第1/2页【javascript】
  • 静态变量和全局变量的区别是什么
  • 静态变量和全局变量的区别是什么 | 静态变量和全局变量的区别是什么 ...

    javascript 用局部变量来代替全局变量第1/2页【javascript】
  • 全面了解PHP中的全局变量【PHP】
  • 全面了解PHP中的全局变量【PHP】 | 全面了解PHP中的全局变量【PHP】 ...

    javascript 用局部变量来代替全局变量第1/2页【javascript】
  • php 全局变量范围分析【PHP】
  • php 全局变量范围分析【PHP】 | php 全局变量范围分析【PHP】 ...