一、一个for实例
<p id="scope3" style="color:red"></p>
var pscope3 = document.getElementById(‘scope3‘); function scope3() { for(var i=0; i<10; i++){ } echo(pscope3, i); } scope3();
1、函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在scope3()活动对象中的,因此在它定义开始,就可以在函数内部访问它。
2、打印出的i为“10”。
3、函数scope3等效于下面的代码:
function scope3() { var i; for(i=0; i<10; i++){ } echo(pscope3, i); }
二、私有作用域的匿名函数
function anonymous() { var position = ‘in anonymous‘; (function(){ for(var i=0; i<10; i++){ } echo(pscope3, position);//打印显示"in anonymous" })(); //pscope3.innerHTML += i;//报错 } anonymous();
1、匿名函数可以用来模仿块级作用域,避免上面的那个问题。
2、在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。
3、上面的那句注释掉的话,取消注释的话,就会显示错误信息:“ReferenceError: i is not defined”。
4、作用域的关系大致如下:
5、position是定义在anonymous函数中的,但可以在匿名函数中打印出来,因为anonymous的作用域包住了匿名函数,在匿名函数中找不到position定义,就往外找。
三、try语句catch部分的特殊情况
function capture() { var ex = ‘in capture‘; try{ i; }catch(ex){ var position= ‘in catch‘; echo(pscope3, ex); //ReferenceError: i is not defined var ex = ‘is catching‘; echo(pscope3, position);//in catch echo(pscope3, ex);//is catching } echo(pscope3, position);//in catch echo(pscope3, ex); //in capture 不是catch中赋的值 echo(pscope3, window.ex); //undefined } capture();
1、catch的一个参数ex与capture函数下的局部变量ex同名。
2、catch中先打印ex,是错误信息,然后赋值为“is catching”,打印出来,但很奇怪,catch外面打印的ex是“in capture”,并不是里面覆盖的值。
3、position在catch中定义,但是可以在catch的外面打印出来。
4、window.ex输出的是undefined,也就是说ex不是全局的,因此可以推出catch后面的大括号是普通语句块的性质。
5、ex的性质可以视为唯一一个把catch语句块当做块作用域的变量,是catch语句块的局部变量。
demo下载:
http://download.csdn.net/detail/loneleaf1/7983577
参考资料:
http://www.laruence.com/2009/05/28/863.html Javascript作用域原理
http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
http://www.cnblogs.com/zxj159/archive/2013/05/30/3107923.html Javascript之匿名函数(模仿块级作用域)
http://www.web-tinker.com/article/20331.html try-catch语句的“伪块作用域”
http://msdn.microsoft.com/zh-cn/library/bzt2dkta%28v=vs.94%29.aspx 变量作用域 (JavaScript)
http://www.cnblogs.com/rubylouvre/archive/2009/08/21/1551270.html javascript变量的作用域
http://www.nowamagic.net/librarys/veda/detail/896 深入浅出JavaScript变量作用域
http://www.web-tinker.com/article/20331.html try-catch语句的“伪块作用域”