模仿块级作用域

模仿块级作用域

JavaScript中没有块级作用域,这意为着在块语句中定义的变量,实际上是包含在函数中而非语句中创建的。

下面的这个实例可以看出:

function outputNumbers(count){
    for (var i=0; i < count; i++){
        alert(i);
    }

    alert(i);   //count
}

outputNumbers(5);//0 1 2 3 4    5(for块语句外输出的)

虽然没有块级作用域,但是可以通过匿名函数来模仿块级作用域

用作块级作用域(通常称为私有作用域)的匿名函数语法如下表示:

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

以上代码定义并立即调用了一个匿名函数。将函数申明包含在一对圆括号中,表示它实际上是一个函数表达式。

注意,下面这种写法会出错

//错误写法
function(){
    //这里是块级作用域
}();

如果一条语句是以function关键字开始,那么这段会被JavaScript解析器认为是函数定义。而函数定义是不能被立即执行的,因此就必须有一个办法,使解析器可以将之识别为函数表达式。因为解析器识别函数定义的条件是以function关键字开始,那么只要在function关键字的前面有任何其他的元素,就会从函数定义转变为函数表达式,所以当我们在其前面填括号就会变成函数表达式了。

下面这种写法也可以:

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

现在让我们重新写开头的那个实例:

function outputNumbers(count){
            
    (function () {
        for (var i=0; i < count; i++){
            alert(i);
        }
    })();
                
    alert(i);   //ReferenceError: i is not defined,出现错误了

outputNumbers(5);//0 1 2 3 4

总结:无论在什么地方,只要临时需要使用变量,就可以使用私有作用域,通过创建私有作用域,每个人都可以使用自己的变量,又不用担心污染全局作用域。

posted @ 2017-02-02 19:21  叶子陪你玩  阅读(206)  评论(0编辑  收藏  举报