javascript模仿块级作用域(第一篇)

  作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java、C++中却是块级作用域。在javascript中,只有函数能够创建作用域,作用域是以function作为边界的。

  先看一段代码:

function outPut(){
   for(i=0;i<5;i++) {
      console.log(i);//0,1,2,3,4  第一个i
   }
   console.log(i);//5  第二个i
};

  解释:在java等语言中,for循环这块代码中的i变量将会被销毁,第二个i打印出来就是undefined了,因为它们是块级作用域。如果需要使第二个i无法访问第一个i,就需要模仿块级作用域!

     刚刚我说过,在javascript中,只有函数能够创建作用域,所以块级作用域需用函数去创建。通常的做法是通过匿名函数去实现,如下:

(function(){     
//这里是块级作用域 
})();  

  解释:javascript模仿块级作用域其实非常简单!但是对于一些基础较差的同学可能还是不能很好的理解,我们把它拆开来看。

var fn=function(){
   //省略一段代码
};
fn();

  这是一段非常普通的函数定义和调用的代码。在javascript中,函数是一等对象,所以可以把函数当成值或参数进行传递(题外话:当把函数当成参数放在另外一个函数当中时,就可以实现回调函数),在这里是将匿名函数赋值给变量fn,然后用一个括号()执行函数fn。

  从上面可能我们会想到:直接用匿名函数function(){...}替换fn来执行不就可以了吗?所以就有了下面的代码:

function(){
...        //Uncaught SyntaxError
}();

  然而这是错误的写法。因为匿名函数仅仅是一个函数声明,函数声明不能够进行函数执行,如果要让它执行怎么办?我们可以通过一些手段让函数声明转变为函数表达式,从而使函数能够执行下去,常见的写法也就是用()括号把匿名函数进行包裹()!

  这种javascript写法其实还有另外一种更加准确的叫法:立即调用的函数表达式(IIFE)。顾名思义:它是一个函数表达式,可以立即执行!下一篇博客我将会更加深入地讲解它。

原文地址:https://www.cnblogs.com/wang-jiang/p/4096303.html