【读书笔记】JavaScript解决全局变量冲突

《编写高质量代码——Web前端开发修炼之道》

1、思路:使用匿名函数,设置全局对象GLOBAL,在每个匿名函数里面声明一个不同的命名空间,把属性挂在命名空间下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用命名空间</title>
</head>
<body>
    <div>XXXXXXXXXXX</div>

    <script type="text/javascript">
        var GLOBAL = {};
        (function(){
           var a = 123,b = "hello world";
           GLOBAL.A = {};
           GLOBAL.A.str2 = a;
           GLOBAL.A.str = b;
        })();

        (function(){
           var a,c="abc";
           GLOBAL.B={};
           GLOBAL.B.str=c;
        })();

        (function(){
            var a=GLOBAL.A.str2,b=GLOBAL.A.str;
            var d="aaaaa";
            d=b+", "+d+a;
            GLOBAL.C={};
            GLOBAL.C.str=d;
        })();

        (function(){
            var test=GLOBAL.B.str;
            alert(test);
            var test2=GLOBAL.C.str;
            alert(test2);
        })();
        </script>
</body>
</html>

2、当然也要避免命名空间的冲突,那么就用函数来生成这些命名空间:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用命名空间</title>
</head>
<body>
    <div>XXXXXXXXXXX</div>

    <script type="text/javascript">
        var GLOBAL = {};
        GLOBAL.namespace = function(str){

            var arr=str.split("."),
            o=GLOBAL;
            //原书中有错误,应该是三等号。
            for(i=(arr[0]==="GLOBAL")?1:0;i<arr.length;i++){      
                    //这么写的(重要):如果CAT已经存在,不会覆盖这个CAT,而是在前一个CAT的基础上添加。如果直接用o[arr[i]]={};GLOBAL.namespace("A.CAT.CAT1");GLOBAL.namespace("A.CAT.DOG3"); 前面的CAT会被后面的CAT覆盖 

                o[arr[i]]=o[arr[i]]||{};
                o=o[arr[i]];

            }
        };

        (function(){
           var a = 123,b = "hello world";
           GLOBAL.namespace("A.CAT");//感觉这样生成命名空间就比较方便。不用再定义命名空间A了。否则应该这样写GLOBAL.A = {};GLOBAL.A.CAT = {};
           GLOBAL.A.CAT.name="panda";
           GLOBAL.A.CAT.age=a;
           GLOBAL.A.str2 =a;
           GLOBAL.A.str=b;
        })();

        (function(){
            var test3 =GLOBAL.A.CAT.age;
            console.log(test3);//123
            var test3 =GLOBAL.A.CAT.name;
            console.log(test3);//panda
        })();
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值