浅淡Javascript作用域

今天阅读《高性能JavaScript》第2章关于作用域,有点云里雾里,之前对其理解也不很深入,借鉴网上资源整理一下相关笔记。

感谢Rain Man的总结,受益匪浅,原文链接http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html,博客园高手如云呀。

  • JavaScript的变量作用域是基于其特有的作用域链的
  • JavaScript没有块级作用域。
  • 函数中声明的变量在整个函数中都有定义

有一个很好的例子,帮助理解作用域链

<script type="text/javascript">
var rain = 1;
function rainman(){
var man = 2;
function inner(){
var innerVar = 4;
alert(rain);
}
inner(); //调用inner函数
}
rainman(); //调用rainman函数
</script>

JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

感谢meteoric_cry,对JavaScript运行机制的总结

  1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段的分析执行的)
  2. 做“语法分析”,有错则报语法错误(比如括号不匹配等),并跳转到5
  3. 对var变量禾function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
  4. 执行代码段,有错则报错
  5. 如果有下一个代码段,则读入下一个代码段,重复2
  6. 结束

原文地址:http://hi.baidu.com/meteoric_cry/blog/item/7df9af2b92caa2f0e7cd40dd.html

posted @ 2011-12-15 19:16  shinebob  阅读(139)  评论(0编辑  收藏  举报