快速业务通道

JS教程:词法作用域和闭包

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06

  1. var classA = function(){
  2.     this.prop1 = 1;
  3. }
  4. classA.prototype.func1 = function(){
  5.     var that = this,
  6.         var1 = 2;
  7.        
  8.     function a(){
  9.         return function(){
  10.             alert(var1);
  11.             alert(this.prop1);
  12.         }.apply(that);
  13.     };
  14.     a();
  15. }
  16. var objA = new ClassA();
  17. objA.func1();

大家应该写过上面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢?这个就是我们这次需要分析的问题—词法作用域

词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。 with和eval除外,所以只能说JS的作用域机制非常接近词法作用域(Lexical scope)。

下面通过几个小小的案例,开始深入的了解对理解词法作用域和闭包必不可少的,JS执行时底层的一些概念和理论知识。

经典案列重现

1、经典案例一

  1. /*全局(window)域下的一段代码*/
  2. function a(i) {
  3.     var i;
  4.     alert(i);
  5. };
  6. a(10);

疑问:上面的代码会输出什么呢?
答案:没错,就是弹出10。具体执行过程应该是这样的

  1. a 函数有一个形参 i,调用 a 函数时传入实参 10,形参 i=10
  2. 接着定义一个同名的局部变量 i,未赋值
  3. alert 输出 10
  4. 思考:局部变量 i 和形参 i 是同一个存储空间吗?

2、经典案例二

  1. /*全局(window)域下的一段代码*/
  2. function a(i) {
  3.     alert(i);
  4.     alert(arguments[0]); //arguments[0]应该就是形参 i
  5.     var i = 2;
  6.     alert(i);
  7.     alert(arguments[0]);
  8. };
  9. a(10);

疑问:上面的代码又会输出什么呢?(( 10,10,2,10 || 10,10,2,2 ))
答案:在FireBug中的运行结果是第二个10,10,2,2

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号