javascript笔记:通过对作用域链和执行环境的深入理解所得出的提
上篇文章里我结束了对象的创建的内容,最后引出了作用域链和执行环境的问题。当我对这块知识有了更深入的了解后,回头看看jQuery源码才知道大师们写的代码是如何的厉害,jQuery源码里很好的运用了作用域链和执行环境的知识来提升程序性能。
好了,不废话了,上篇博文里对作用域讲的比较简略。其实对作用域的理解是理解整个javascript语言的关键所在,特别我在写javascript笔记时候曾对很多怪异的javascript用法无法理解的透彻,究其原因还是没有真正理解javascript里作用域的概念。
Javascript里的作用域到底决定了什么呢?作用域决定了那些变量能被函数所访问(注意:作用域是函数的内部属性,谈到作用域是绕不开的function),作用域也确定了this指针的指向。上篇博文里我说道,程序其实就是不断检索数据的过程,那么检索数据的效率决定了程序的性能,因此作用域既然决定那些变量能被访问,当然也决定了检索这些变量的方式,所以想写出高效的javascript程序灵活运用作用域的原理是关键了。
上篇博文里面,我写了一个函数,代码如下:
<script type="text/javascript">
function add(a,b)
{
var sum = a + b;
return sum;
}
</script>
大家可以看到这个函数属于window而非function,在页面被加载时候,add函数会被初始化,生成属于自己的作用域链,上篇文章里我在firebug里设定断点调试贴出了一个我截图下来的变量图,认为这就是函数add的Scope所包含的变量,现在发现当时理解是错误的,那些变量是window的“全局环境”的变量图而非是add函数的内部属性Scope的变量图。在此我纠正一下。
下面我要着重讲讲作用域链和执行环境,这块知识我在javascript对象创建的中篇里提到过,这里我将那些知识回顾下:
什么是执行环境呢?在javascript里面执行环境分为两类,一类是全局环境,一类是局部环境,整个页面里被共享的方法和属性就是在全局环境,相对于全局环境,函数{}号里的执行环境就是局部环境,执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都定义了一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象里,虽然我们自己编写的代码无法访问这个对象,但解析器在处理数据时候后台会使用到它。
全局执行环境另一种说法是最外围的一个执行环境,在web浏览器的范围中(actionscript也是施行了ECMAScript标准,它的全局范围就和javascript的全局范围不同),全局执行环境被认为是window对象,因此全局变量和函数都是作为window对象的方法和属性来创建的,全局执行环境知道应用程序退出比如关闭网页或浏览器才会被销毁。而局部环境则是以函数对象作为关联对象。
大家要注意环境的前缀是:执行,也就说只有函数被执行(局部执行环境)和页面被加载(全局执行环境),下面就是页面被加载时候的全局执行环境变量:
现在我们要执行add函数了,代码如下:
function add(a,b)
{
var sum = a + b;
return sum;
}
console.log(add(10,20));
这是add函数的执行环境的变量图是:
1.firebug:
相关新闻>>
- Javascript 兼容 IE6、IE7、FF 的“加入收藏”“设为首页”
- 好好学一遍JavaScript 笔记(一)——基础中的基础
- 好好学一遍JavaScript 笔记(二)——encode、数组、对象创建
- 好好学一遍JavaScript 笔记(三)——StringBuffer、prototype
- 好好学一遍javaScript 笔记(四)——Attribute、HTML元素、文档碎
- 好好学一遍JavaScript 笔记(五)——正则表达式基础
- 好好学一遍JavaScript 笔记(六)——正则表达式基础二
- 好好学一遍JavaScript 笔记(七)——RegExp对象与常用正则
- 好好学一遍JavaScript 笔记(八)——冒泡型事件、捕获型事件
- JavaScript详解
- 发表评论
-
- 最新评论 更多>>