设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

搜索
查看: 7490|回复: 2

你理解了闭包 但你理解了语法作用域么?

[复制链接]
发表于 2010-9-2 16:59:42 | 显示全部楼层 |阅读模式
js的语法作用域分为四个级别,从高向低依次分为:

1 全局作用域
2 函数作用域
3 批语句作用域 / 语句作用域
4 表达式作用域

其中遵循三个规则:

1 同级作用域可以互相包含
2 高级作用域可以包含低级作用域
3 低级作用域不可以包含高级作用域


有两点需要注意:

注意1 区别复合语句的{} 与 批语句的{}:


  1. if (expression) {
  2. statement;
  3. }else{
  4. statement;
  5. }
复制代码

复合语句:if的语法作用域其实只是if (expression)后的单条语句,单条语句可以是语句或复合语句,如果一个大括号{}内仅有一条语句,大括号省略后可通过语法检查,则此大括号表示复合语句。
如 if(expression){statement;} 与 if (expression) statement;



  1. try{
  2. statement;
  3. }catch(ex){
  4. statement;
  5. }finaly{
  6. statement;
  7. }
复制代码


try语句的大括号和if语句的大括号明显的不同之处在于,如果你把try后面的{}去掉,语法分析会提示错误,因为try后面的{}是语法的一部分,是必须的,表示的是一个批语句。

批语句和语句的作用域是相同的。


注意2 低级别作用域包含高级别作用域时会怎样?

  1. <script type="text/javascript">
  2.         console.log(a); //将输出function a  证明语法分析期已将a函数绑定到闭包对象上
  3.         console.log(b); //输出undefined  证明语法分析器已将变量b 绑定到闭包对象上
  4.         if (false){
  5.                 function a(){
  6.                         return arguments.callee;
  7.                 }
  8.         }else{
  9.                 var b = a();
  10.         }
  11.         console.log(a); //输出fucntion a
  12.         console.log(b); //输出function b  原因是运行期将function a的实例赋予了变量b
  13. </script>
复制代码

上面的代码很清楚的分析了javascript语法分析期  和 运行期  javascript引擎的工作机制,也温故了闭包的知识。



出处:
李超软件实验室
发表于 2012-8-12 04:24:21 | 显示全部楼层
确实不理解呵呵
发表于 2012-12-12 22:15:07 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 加入无忧

本版积分规则

小黑屋|手机版|Archiver|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445   鄂公网安备 42011102000433号

GMT+8, 2017-11-23 19:05 , Processed in 0.093887 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表