如何检测 JavaScript 中的自定义全局变量

简介: 译者注: 全局变量的滥用是一种很糟糕的程序设计。很容易造成依赖和状态混乱。 而在 Java 和 JavaScript 这种自动垃圾回收的语言里面,全局(可见的)变量一直是内存泄露的隐藏杀手。

译者注: 全局变量的滥用是一种很糟糕的程序设计。很容易造成依赖和状态混乱。 而在 Java 和 JavaScript 这种自动垃圾回收的语言里面,全局(可见的)变量一直是内存泄露的隐藏杀手。

本文提供了一种靠谱的检测全局变量实现方式.

在 JavaScript中随意设置全局变量并不是个好习惯。原文作者参与了 MooTools 项目, 据他所说, 已经有十年时间天天听到与此相关的谈论。 MooTools 扩展了浏览器的原生JS对象, 但也使用了一些全局变量, 如 Browser$$。我觉得 “全局变量太恐怖了!(原文 global vars are terrible)” , 有点无奈的是, jQuery 和 JavaScript loaders 都用了至少一个全局变量。

除了故意的全局变量, 否则将一个对象泄漏到全局空间其实是很糟糕的习惯, 一般就是烂代码才会这样做。那么怎么检测有哪些全局变量是我们自己放进去的呢? 明白了原理代码就很简单:

// 创建一个新的  iframe, 然后将其 `contentWindow` 中的属性值
// 与当前 window 中的属性值对比, 不在其中的就是自定义对象
(function() {
    var iframe = document.createElement('iframe');
    iframe.onload = function() {
        // 使用 Object.keys() 获取对象的所有属性名 
        var iframeKeys = Object.keys(iframe.contentWindow);
        Object.keys(window).forEach(function(key) {
            // 如果存在 window 中,而 iframe 中却没有
            if(!(key in iframeKeys)) {
                // 输出到控制台,也可以加入数组,自己处理
                window.console && console.log && console.log(key);
            }
        });
    };
    // 必须在 设置 src 属性之前添加 onload 事件。
    // 在 onload 里面 contentWindow 才变得可用! 
    iframe.src = 'about:blank';
    document.body.appendChild(iframe);
})();

当然,因为是2个 window 对象,也是 2个不同的 document, 所以你会看到 window, document, top, 和 location 都被输出了。但其他的都是被 JavaScript 代码有意或无意地泄露到全局空间。

原文链接: Get Global Variables with JavaScript

原文日期: 2015年08月31日

翻译日期: 2015年09月10日

翻译人员: 铁锚 http://blog.csdn.net/renfufei

目录
相关文章
|
10月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
486 133
|
10月前
|
JavaScript 前端开发
在Node.js中,如何合理使用模块来避免全局变量的问题?
在Node.js中,如何合理使用模块来避免全局变量的问题?
349 71
|
存储 JavaScript 对象存储
js检测数据类型有那些方法
js检测数据类型有那些方法
366 59
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
1019 159
|
编解码 前端开发 JavaScript
javascript检测网页缩放演示代码
javascript检测网页缩放演示代码
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1704 9
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
431 6
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
611 4
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
623 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法