今天在查看页面控制台的时候,无意中看到了一个暴露到全局的变量 i,全局变量是不会被压缩工具压缩成简写的字母,这个被频繁使用的变量名暴露到全局也是个相当大的隐患,可能一个不小心就覆盖了第二次暴露到全局的同名变量。

刚开始我就怀疑是自己出现了这样愚蠢的错误:

function A() {// 在一个函数中多次用到了 for 循环,为了节省变量,都是用了变量 ifor(var i = 0; ...) {//...
    }for(i = 0; ...) {//...
    }for(i = 0; ...) {//...
    }
}

结果在某次拆分函数的时候,忘记定义:

function A(){for(var i = 0; ...) {//...
    }for(i = 0; ...) {//...
    }
}
function B(){for(i = 0; ...) {//...
    }
}

这个时候,变量 i 在 B 函数执行的时候就暴露到了全局。抱着这样的怀疑,我搜索了 50 多个模块的代码,一无所获...此时,我依然十分怀疑是自己的程序哪里疏忽了,全局搜索 i =i++,五分钟过去了,未果...

找到这个变量

如果这个变量名叫做 fuckIE,分分钟全局搜索就出来了,类似这种简短的常用的变量,着实让人头疼了好一会儿。后来想到了这个方案:

Object.defineProperty(window, "i", {get : function(){ return window.i; },set : function(newValue){ debugger;window.i = newValue; },enumerable : true,configurable : true
});

在全局定义变量 i 的时刻,打一个断点,然后 F10 往前走一步,果然,在控制台右侧的 Call Stack 中找到了端倪!

这个变量是从第三方组件中(offline组件,使用相当频繁的一个组件)暴露出来的,估计出错的方式同我上面的描述差不多,拆分函数的时候忘记重新定义变量 i。

当然还有更快的方式:

window.__defineSetter__('i', function(){ debugger })

不挖坑才是最好的解决方案

1. 使用 use strict;

在严格模式下,这种问题暴露无遗,每个函数内都加上 use strict;,虽然在语言上有所限制,但是低级错误一定不会出现,因为严格模式会给你报错!

2. 使用 jslint/jshint 等 js 分析工具

这些东西除了配置上较为繁琐,用起来还是很顺手的,做过配置的错误都会直接在 IDE 上标红显示出来,很容易发现问题,但是不建议一个项目中途使用,因为代码习惯的问题,很多地方被 js 分析工具作为错误抛出来,改动量是相当大的。

我有次也犯了个比较隐晦的错误:

$(window).on('click', function(evt){var target = event.target.nodeName.toLowerCase();if(target !== 'ul'){//...
    }
});

在 IE 和 Chrome 下,代码跑得好好的,但是到了测试较少的 FF 下,问题出来了,event is not defined.,IE 和 Chrome 是支持 window.event 抓取当前事件对象的,而 FF 不支持,所以每次点击页面上都会报错。。。

诸如此类的问题,在我们的平时编码之中不胜枚举,所以有一个编码规范作为强约束是十分有必要的!

如何快速定位不小心暴露到全局的变量相关推荐

  1. 暴露的全局方法_面试刷题36:线程池的原理和使用方法?

    线程池原理和使用在面试中被高频问到,比如阿里的面试题.下面我们针对问题来进行回答. 为什么要使用线程池? 线程池的使用场景有2: 1, 高并发场景:比如tomcat的处理机制,内置了线程池处理http ...

  2. 使用Arthas快速定位SpringBoot接口超时问题的神器

    使用Arthas快速定位SpringBoot接口超时问题的神器 文章系转载,便于整理和分类,原文地址:https://mp.weixin.qq.com/s/Nm_QGzCtwY08Dd1XOtPaaw ...

  3. 使用MAP文件快速定位程序崩溃代码行

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...

  4. 使用MAP文件快速定位程序崩溃代码行(转)

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...

  5. 如何快速定位 Redis 热 key

    背景 在 Redis 中,热 key 指的是那些在一段时间内访问频次比较高的键值,具体到业务上,商品的限时抢购.瞬时的新闻热点或某个全局性的资源,都极有可能产生热点 key. 热点 key 的出现可能 ...

  6. pycharm 最上面的快速定位标签_受用一生的高效 PyCharm 使用技巧(四)

    原标题:受用一生的高效 PyCharm 使用技巧(四) 大家好,距离最近一篇 PyCharm 使用技巧的文章已经过去一月有余,最近虽然也比较忙,但是一直没忘记录下一些我觉得值得分享的小tip.这个系列 ...

  7. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

  8. CSS BUG的快速定位及解决

    相信大家对于常见 CSS BUG 的处理已经相对比较熟悉,例如:IE6 Three Pixel Gap.IE5/6 Doubled Float-Margin Bug 等等.但时常我们也会碰到复杂的 C ...

  9. linux查找项目中的问题,教你如何快速定位项目中慢查询[项目管理]

    1. 使用对象: 项目经理或者项目管理者 2. 数据库: mysql 3. 快速定位慢查询: 启动mysql时,启动慢查询日志: 3.1 Window系统: 第一种:bin\mysqlId.exe  ...

最新文章

  1. java urlconn 下载慢_使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法...
  2. 初探swift语言的学习笔记五(线程)
  3. android手机如何安装apk文件,如何安装APK文件到自己的android手机里?.doc
  4. mysql 更改root密码字段不存在_初次登陆MySQL修改密码是出现Unknown column 'password' in 'field list'的解决方法...
  5. MySQL常见问题及解决方案
  6. 医院时钟系统(子母钟系统)构成及应用
  7. Excel列与数字的转换
  8. 在阳光下关闭自动调节功能后,背光很亮,打开自动调节亮度,背光很暗[FAQ12718][AAL] 打开MTK_AAL_SUPPORT 后,自动亮度调节速度变慢
  9. 电脑dns服务器未响应啥意思,电脑诊断出DNS服务器未响应是什么意思
  10. 使用阿里云服务器搭建代理服务器
  11. linux大于3T硬盘多个分区,linux之Ubuntu挂载3T硬盘或大于2T磁盘
  12. 红米Android降级,红米Note 5(安卓9.0 不要降级刷低版本)纯净ROOT线刷包分享,一键救砖教程,轻松刷回官方系统,流畅如初!...
  13. 全屏抗锯齿技术-FSAA
  14. 推荐安全且匿名的邮箱 ProtonMail -- PGP算法
  15. stm32f103vet6采集dht11温湿度数据通过usart1在串口助手中显示
  16. 招聘ABAP开发程序员
  17. 电商带来物流变革物流行业
  18. django 实现简单的搜索功能
  19. 老男孩python培训价格
  20. mysql给表改名_mysql重命名表

热门文章

  1. 初识空中计算(Over-the-Air Computation)
  2. 智能指针:-和*运算符重载 + 模板技术 实现智能指针(C++)
  3. 关于代码效率提升的方法心路历程(购物车)
  4. 【转】[caffe]深度学习之图像分类模型AlexNet解读
  5. 数据库自动备份脚本并删除前3天的备份
  6. Java中看今天是星期几,礼拜几
  7. python多线程框架_Python爬虫第七天:多线程爬虫|Scrapy框架
  8. 如何写出让人抓狂的代码?
  9. Jeewx 捷微管家操作配置文档(开源版本)
  10. JEECG 深度使用培训班 周六周日公开课(一期班)