javascript笔记:通过对作用域链和执行环境的深入理解所得出的提(2)

来源:未知 责任编辑:责任编辑 发表时间:2013-11-15 19:50 点击:

\

 

  2.chrome的代码调试器:

 

\

 

  代码的结构图如下:

 

\

 

  在函数被执行时候,函数会创建一个“运行期上下文(execution context)”的内部对象,这个运行期上下文在我的理解里就是函数的执行环境,每个运行期上下文都有自己的作用域链,用于标识符解析。

  当运行期上下文被创建时候,他的作用域链初始化为当前运行函数【Scope】属性中所含的对象(见firebug和chrome调试器里的内存图,比如add函数除了a,b,sum,this还有arguments,不过这个在firebug和chrome调试器里看不到的)。这些值按照它们出现在函数中的顺序,被复制到执行期上下文的作用域链中。这个过程一旦完成,一个被称为“活动对象(activation object)”的新对象就为执行期上下文创建好了,活动对象作为函数运行期的可变对象,包含了所有局部变量,命名参数,参数集合以及this。然后此对象被推入到作用域链的前端。当运行期上下文被销毁的时候,活动对象也随之被销毁。在函数执行过程中,每遇到一个变量都会进行一次标识符的解析,这种解析决定了我们从啥地方获取变量或者将变量存储到什么地方,这个过程是搜索整个函数运行期上下文的作用域链,查找同名的标识符,搜索过程都是从作用域头部开始,也就是当前运行函数的活动对象。找到了就使用它,没有找到则会继续搜索作用域链中的下一个对象,搜索过程会延续到找到标识符为止或者是没有找到为止,这种情况就是标识符没有被定义了。

  在javascript里使用变量就是在做标识符解析,由上面的解释我们知道标识符的解析一定是有计算机性能的消耗的,当标识符位于执行上下文作用域链的位置越深,性能也就越慢了,那么到底什么地方最慢了?比如我们举例的函数add,当我们搜索到global全局变量总会比函数内部的局部变量慢,假如我们定义个更复杂的函数里面有多层嵌套的话,访问全局变量就是性能的梦魇了。因此在函数中我们尽量多使用函数内部的局部变量。(由于浏览器的产品的差异,个别浏览器的访问变量的性能可能会有差异,但是总体而言,访问函数局部变量永远是最快的)。

  尽量使用局部变量,就带来一个十分重要的提高程序性能的用法:我们在函数内部使用全局变量可以说是一种跨作用域操作,如果某个跨作用域的值在函数的内部被使用到一次以上,那么我们就把它存储到局部变量里。

  代码书写的格式就是:

function ftn()

{

    var doc = document;

    .......

}

 

 

  将全局的变量用var定义到局部变量里。

  这个用法在jQuery源码里一开头就清晰可以到看:

var jQuery = function( selector, context ) {

        // The jQuery object is actually just the init constructor 'enhanced'

        return new jQuery.fn.init( selector, context );

    },

 

    // Map over jQuery in case of overwrite

    _jQuery = window.jQuery,

 

    // Map over the $ in case of overwrite

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Gb2312转utf-8编码的方法(vbs+js)
  • 如何使用Ajax技术开发Web应用程序(1)
  • js跳转路径问题
  • JavaScript模仿桌面窗口
  • 用js检测两个线段是否相交
  • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
  • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
  • 我是如何去了解jquery的(六),案例之幻灯片轮换
  • Jquery封装幻灯片效果
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1