zoukankan      html  css  js  c++  java
  • 全局变量污染 闭包 命名空间

    原则

    1. 用匿名函数将脚本包起来;

    2. 使用多级命名空间。

    这第二条“使用多级命名空间”这个,我觉得并不是很完美的好主意。因为如果级数太多的话会造成变量名字变得长的一逼。

    改进过程

    原始代码

    没有做过任何优化的满目疮痍的代码。a.js 和 b.js 都有全局变量 window.a ,导致冲突,全局变量属于 window 作用域下的。

    //a.js
    <script type="text/javascript">
        //都什么时代了,script标签还写type属性呢?黄牌警告!下次绝逼不写了。
        var a = 123, b = "hello world";
    </script>
    
    //b.js
    <script>
        //看!这把没有写了吧~就是这么任性,上面的那个写了的也绝逼不改!
        var a, c = "abc";
    </script>

    使用匿名函数

    通过匿名函数改变了a.js 和 b.js 中的变量 a 的作用域,使得他们都不再是全局变量了,但是在 b.js 中无法访问在 a.js 中的变量 a, 换而言之,他们之间没办法通信了。

    //a.js
    (function() {
        var a = 123, b = "hello world";
    })();
    
    //b.js
    (function() {
        var a, c = "abc";
    })();

    使用全局变量进行通信

    var str;
    //a.js
    (function() {
        var a = 123,
        b = "hello world";
        window.str = a;
    })();
    
    //b.js
    (function() {
        var a, c = "abc";
        alert(window.str);
    })();

    使用 window.str 这种全局全局变量作为通信的媒介其实并不是一个好办法,这样做会导致全局变量越来越多,反而不好维护。

    使用命名空间

    var GLOBAL = {};
    //a.js
    (function() {
        var a = 123,
        b = "hello world";
        GLOBAL.A.a = a;
    })();
    
    //b.js
    (function() {
        var a, c = "abc";
        alert(GLOBAL.A.a);
    })();

    使用单一的全局变量 GlOBAL ,匿名空间里需要保存的属性都在全局变量 GLOBAL 的基础上使用命名空间的方式进行拓展。这里给命名空间起名字也需要很讲究,好的命名规则会对团队协同合作有很大的帮助。具体的命名方式待我卖个关子,以后再说。未完待续

  • 相关阅读:

    java 线程池
    java 普通内部类和静态内部类
    JVM
    java httpUtil
    maven 常见问题
    计算java对象的内存占用
    HTML5简单入门系列(九)
    HTML5简单入门系列(八)
    HTML5简单入门系列(七)
  • 原文地址:https://www.cnblogs.com/LiSuSpAu/p/5738863.html
Copyright © 2011-2022 走看看