都是全局变量惹的祸


        全局变量之“祸”由来已久, 人所共“愤”,  但平时在做开发时, 常常还是不自觉地依靠全局变量, 比较便捷, 也容易出很隐蔽的BUG 。

 

        最近发现了一例, 做了简化处理, 不过本质是一样的, 供大家日后借鉴。

        var  global = null;      // 全局变量常常不会如此明显地自我标识, 不过要特别注意 public 变量

        var obtainGlobal = function() {
              return global;
        }

        var  init = function() {
              global =   { "a": 1, "b":  null };       
        }

        var  search = function() {
               console.log(global);  
        } 

       var  another = function() {
              var xx = obtainGlobal();
              xx.b = "I am back";   //   这里被隐蔽地修改了, 引用变量的属性被修改 
       }

       init(); 
       search();
       another();
       search();

       结果: 
          Object {a: 1, b: null}
  Object {a: 1,b: "I am back"}

       BUG 出现的过程是:
       STEP1:  应用启动, 调用 init() 方法初始化 global;
       STEP2:  查询操作, 调用 search() 方法, 此时获取的 b 是 null;
       STEP3:  另一个操作, 调用 another() 方法, 这里巧妙地修改了全局变量, 将 b 赋值为 "I am back";
       STEP4:  再次查询操作, 调用 search() 方法, 此时获取的 b 是 "I am back".

       应用中, b 应该是显示的; 当时百思不得其解, 为什么有的时候可以显示 b , 有的时候不能显示 b; 在初始化的时候, 发现 b 是没有被显示的, 后来又被修改了, 但又始终找不到在哪里被修改了。 
       
       这里由于代码比较少, 因此, 相对容易看到问题的存在; 当出现在项目中时, 这些全局变量的读取和修改就变得非常隐蔽, 掩藏在代码海洋中, 再也难以寻见, 注意到, 这里无法通过 IDE 的搜索功能搜索到 global 被修改的痕迹。
       

 

转载于:https://www.cnblogs.com/lovesqcc/p/4037707.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值