都是全局变量惹的祸
全局变量之“祸”由来已久, 人所共“愤”, 但平时在做开发时, 常常还是不自觉地依靠全局变量, 比较便捷, 也容易出很隐蔽的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}
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 被修改的痕迹。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了