如何快速定位不小心暴露到全局的变量
今天在查看页面控制台的时候,无意中看到了一个暴露到全局的变量 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 不支持,所以每次点击页面上都会报错。。。
诸如此类的问题,在我们的平时编码之中不胜枚举,所以有一个编码规范作为强约束是十分有必要的!
如何快速定位不小心暴露到全局的变量相关推荐
- 暴露的全局方法_面试刷题36:线程池的原理和使用方法?
线程池原理和使用在面试中被高频问到,比如阿里的面试题.下面我们针对问题来进行回答. 为什么要使用线程池? 线程池的使用场景有2: 1, 高并发场景:比如tomcat的处理机制,内置了线程池处理http ...
- 使用Arthas快速定位SpringBoot接口超时问题的神器
使用Arthas快速定位SpringBoot接口超时问题的神器 文章系转载,便于整理和分类,原文地址:https://mp.weixin.qq.com/s/Nm_QGzCtwY08Dd1XOtPaaw ...
- 使用MAP文件快速定位程序崩溃代码行
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...
- 使用MAP文件快速定位程序崩溃代码行(转)
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...
- 如何快速定位 Redis 热 key
背景 在 Redis 中,热 key 指的是那些在一段时间内访问频次比较高的键值,具体到业务上,商品的限时抢购.瞬时的新闻热点或某个全局性的资源,都极有可能产生热点 key. 热点 key 的出现可能 ...
- pycharm 最上面的快速定位标签_受用一生的高效 PyCharm 使用技巧(四)
原标题:受用一生的高效 PyCharm 使用技巧(四) 大家好,距离最近一篇 PyCharm 使用技巧的文章已经过去一月有余,最近虽然也比较忙,但是一直没忘记录下一些我觉得值得分享的小tip.这个系列 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- CSS BUG的快速定位及解决
相信大家对于常见 CSS BUG 的处理已经相对比较熟悉,例如:IE6 Three Pixel Gap.IE5/6 Doubled Float-Margin Bug 等等.但时常我们也会碰到复杂的 C ...
- linux查找项目中的问题,教你如何快速定位项目中慢查询[项目管理]
1. 使用对象: 项目经理或者项目管理者 2. 数据库: mysql 3. 快速定位慢查询: 启动mysql时,启动慢查询日志: 3.1 Window系统: 第一种:bin\mysqlId.exe ...
最新文章
- java urlconn 下载慢_使用HttpURLConnection下载文件时出现 
java.io.FileNotFoundException彻底解决办法...
- 初探swift语言的学习笔记五(线程)
- android手机如何安装apk文件,如何安装APK文件到自己的android手机里?.doc
- mysql 更改root密码字段不存在_初次登陆MySQL修改密码是出现Unknown column 'password' in 'field list'的解决方法...
- MySQL常见问题及解决方案
- 医院时钟系统(子母钟系统)构成及应用
- Excel列与数字的转换
- 在阳光下关闭自动调节功能后,背光很亮,打开自动调节亮度,背光很暗[FAQ12718][AAL] 打开MTK_AAL_SUPPORT 后,自动亮度调节速度变慢
- 电脑dns服务器未响应啥意思,电脑诊断出DNS服务器未响应是什么意思
- 使用阿里云服务器搭建代理服务器
- linux大于3T硬盘多个分区,linux之Ubuntu挂载3T硬盘或大于2T磁盘
- 红米Android降级,红米Note 5(安卓9.0 不要降级刷低版本)纯净ROOT线刷包分享,一键救砖教程,轻松刷回官方系统,流畅如初!...
- 全屏抗锯齿技术-FSAA
- 推荐安全且匿名的邮箱 ProtonMail -- PGP算法
- stm32f103vet6采集dht11温湿度数据通过usart1在串口助手中显示
- 招聘ABAP开发程序员
- 电商带来物流变革物流行业
- django 实现简单的搜索功能
- 老男孩python培训价格
- mysql给表改名_mysql重命名表
热门文章
- 初识空中计算(Over-the-Air Computation)
- 智能指针:-和*运算符重载 + 模板技术 实现智能指针(C++)
- 关于代码效率提升的方法心路历程(购物车)
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
- 数据库自动备份脚本并删除前3天的备份
- Java中看今天是星期几,礼拜几
- python多线程框架_Python爬虫第七天:多线程爬虫|Scrapy框架
- 如何写出让人抓狂的代码?
- Jeewx 捷微管家操作配置文档(开源版本)
- JEECG 深度使用培训班 周六周日公开课(一期班)