作用域有词法作用域和块级作用域之分,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)。顾名思义:它是一个函数表达式,可以立即执行!下一篇博客我将会更加深入地讲解它。