2018-12-05

7.3模仿块级作用域

javascript没有块级作用域的概念。这就意味着在快语句中定义的变量,实际上是在包含函数中而非语句中创建的:

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

在java、c++等语言中,变量i只会在for循环的语句块中有定义,循环一旦结束,变量就会被销毁。
可是在javascript中,变量i时定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函数内部随处访问他。
并且就算错误的生命了同一个变量,也不会改变它的值。它只会对后续的声明视而不见。

匿名函数可以用来模仿块级作用域并避免这个问题

(function(){
      //这里是块级作用域
})();
//这里是定义并立刻调用了一个匿名函数。

将函数声明包含在一对圆括号中,表示它实际是一个函数表达式。
紧随其后的另一对圆括号会立即调用这个函数。

来看一个例子:

var someFunction = function(){
        //这里是块级作用域
}//出错!!!
someFunction();

这段代码会导致语法错误,是因为javascript将function关键字当做一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。
要将函数声明转换成函数表达式,只要给它加上一堆圆括号即可。↓↓↓

(function(){
    //这里是块级作用域
})();
function outputNumbers(count){
    (function(){
        for(var i=0;i<count;i++){
              alert(i);
          }
    })();  
    alert(i);//导致一个错误!
}

在这个重写后的outputNumbers()函数中,我们在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。因此变量i只能在循环中使用,使用后即被销毁。
而在私有作用域中能够访问变量count,是因为这个匿名函数是一个闭包,它能够访问包含作用域中的所有变量。

一般来说,应该尽量少向全局作用域中添加变量和函数。如果是一个由很多开发人员共同参与开发的大型应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可以使用自己的变量,又不必担心弄乱全局作用域:

(function(){
    var (now.getMonth() == 0 && now.getDate() == 1){
        alert("Happy new year!");
    }
})();
//将这段代码放在全局作用域中,可以用来确定哪一天是1月1日
//如果到了这一天,就会向用户显示一条祝贺新年的消息。
//其中的变量now现在是匿名函数中的局部变量。而我们不必在全局作用域中创建它。

这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。



7.4.1 静态私有变量

通过在私有作用域中定义私有变量或函数,同样也可以创建特权方法,其基本模式:

(function(){
    //私有变量和私有函数
    var privateVariable = 10;

    function privateFunction (){
        return false;
    }

    //构造函数
    MyObject = function(){
    };

    //共有/特权方法
    MyObject.prototype.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }
})();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 4,247评论 0 1
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,714评论 0 13
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,717评论 0 21
  • 第九章 公布成绩的第二天,是星期二,第一节课是数学课,吴老师很早就到了,站在讲台桌前,时不时的看看昨天熬夜做好的...
    王王小诺谷阅读 2,607评论 0 1
  • 1框架介绍 1.1环境准备 1、在eclipse中新建一个工作空间 2、在window-pererferences...
    PublicDZ阅读 3,950评论 0 2

友情链接更多精彩内容