当前位置:首页 > 短网址资讯

FT12短网址教你如何快速定位不小心暴露的全局变量

www.ft12.com9年前 (2017-07-21)短网址资讯1017

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

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

function A() {    // 在一个函数中多次用到了 for 循环,为了节省变量,都是用了变量 i
    for(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 不支持,所以每次点击页面上都会报错。。。

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


扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_306.html

标签: 定位变量
分享给朋友:

相关文章

FT12短网址教你如何利用大数据算法定位网站性能瓶颈(BOSS)

FT12短网址教你如何利用大数据算法定位网站性能瓶颈(BOSS)

FT12短网址资讯:架构师非常关注性能问题,上篇文章中我们介绍了京东的自动化压测体系 ForceBot,这篇文章来自 LinkedIn 的技术博客,介绍如何通过大数据算法来分析调用数据,自动定位性能瓶颈。本文由高可用架构翻译。背景我们 FT…

META标签指南:哪些meta标签该用哪些不该用?

META标签指南:哪些meta标签该用哪些不该用?

META标签是网页代码中HEAD区的一个关键标签,其提供的信息虽然用户不可见,但却是文档的最基本的元信息。说起meta标签,许多SEOer的第一反应就是K与D:keywords和description。这两种短链接是在优化过程中最常用的也是…

阿里为什么不收购百度?

阿里为什么不收购百度?

本文来自一个网友的问题汇总,对于阿里为什么不收购百度,网友回复众说纷纭,甚至有的网友反驳提出此问题者有点略显不专业,不管怎么样。让我们来看看大家是怎么看待这件事的!下面这位对系统的分析了阿里跟百度的关系,比较专业值得一看:别说阿里,就算是腾…

一个40岁华为男的自白:作为前IBM员工,除了钱,我为什么要来华为“受虐”

一个40岁华为男的自白:作为前IBM员工,除了钱,我为什么要来华为“受虐”

我离开“我摸”(IBM的江湖俗名)加入华为的时候,老板、同事、同学、朋友都十分惊讶的问我为什么。当时总是很装逼的说:“换个环境,我想看看自己的career。”实际上入职后的好几年里,我还在问自己到底为什么来华为。别笑我如此纠结,当年华为的名…

自媒体时代"REO"将完全取代SEO

自媒体时代"REO"将完全取代SEO

摘要:近两年来,伴随着BAT纷繁涌入自媒体平台,自媒体发展可谓迎来爆发。自媒体平台火爆起来是从今日头条异军突起而引发的,它是一款基于数据挖掘的推荐引擎商品,它为用户推荐有价值的、个性化的信息,提供连接人与信息的新型服务,是国内移动互联网领域…

从网吧到网咖:80后男生的社交情怀

从网吧到网咖:80后男生的社交情怀

网鱼网咖的电脑区也和传统网吧大相径庭,采取类似阶梯教室的环状布局,摆放清一色的苹果一体机。除了从包房中不时传出“别送别送”(注:意思是告诫队友别送死)的叫声和激动的呼喊声,工作日时间的大厅中并没什么人,穿着印有网鱼logo白衬衫店员时不时驻…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。