js中的块作用域

今天我们来一起研究下JavaScript中的变量作用域问题,话不多说,直接上代码。

1     <script type="text/javascript">
2         (function(){
3             for(var i = 0; i < 5; i++){
4                 console.log(i);
5             }
6             console.log(i);
7         })()
8     </script>

这是一个很简单的for循环,打印出i的值,就是循环的次数。在一些高级语言中,比如说java,c,c++等,结果会是0,1,2,3,4,然后运行到第六行的时候就会报错了。但是在JavaScript中却是有点不一样的,运行结果如下。

多出了一个5,为什么会这样呢?原因是这样的,因为JavaScript中是没有块级作用域这个概念的,所以在循环执行完毕后,i在当前方法内还是有效的,因此执行完最后一次++后,i的值就变成了5。

那么我们有没有什么方法可以让JavaScript像高级语言中一样有块级作用域呢?方法是有的,代码如下:

 1     <script type="text/javascript">
 2         (function(){
 3             (function(){
 4                 for(var i = 0; i < 5; i++){
 5                     console.log(i);
 6                 }
 7             })()
 8             console.log(i);
 9         })()
10     </script>

输出的结果是这样的,

我们可以看到i is not defined。这说明现在i已经不存在了。分析一下原因,(function(){})()这种写法叫作立即执行函数,在这个函数内部的function拥有自己的作用域。因此,在循环完成后,再去访问i就会产生如上的报错信息了。

 

posted @ 2016-03-17 17:35  cooljser  阅读(309)  评论(0编辑  收藏  举报