有没有办法猜测是否已分配了一些全局变量?

时间:2014-08-17 21:12:26

标签: javascript debugging

在JavaScript中,如果你声明一个这样的构造函数:

var PMFont = function(text, font, size) {
    this.text = text;
    this.font = font;
    this.size = size;
    /*
    ...
    ton of code
    ...
    */
    x = 15;
};
var test = new PMFont('dd', 'Arial', 92);

你创建了一个像上面例子那样的全局变量:x = 15;,有没有办法知道,一旦创建了你的对象,是否有 new 全局变量创建

我已经下载了一些代码,我想知道是否有一些无用的变量在我的例子中留在内存中。我可能遇到更糟糕的问题,例如:

imgd = ctx.getImageData(0, 0, this.baseWidth, this.baseHeight)

...获取HTML5画布2D上下文的所有数据,如果没有释放,则会占用大量内存。

2 个答案:

答案 0 :(得分:0)

是。您可以通过存储地图然后针对新地图对其进行测试来检查是否有任何对象发生了变化。这个助手会为你做这件事:

<强> JS

function objectWatch(object) {

    var keys = Object.keys(object);
    return {
        done: function () {
            var o = {
                created: {},
                removed: {}
            },
            newkeys = Object.keys(object);

            if (keys.length === newkeys.length) return;
            if (keys.length > newkeys.length) {
                for (var i = 0, l = keys.length; i < l; i++) {
                    if (newskeys.indexOf(keys[i]) === -1) o.removed[keys[i]] = object[keys[i]];
                }
            }
            for (var i = 0, l = newkeys.length; i < l; i++) {
                if (keys.indexOf(newkeys[i]) === -1) o.created[newkeys[i]] = object[newkeys[i]];

            }

            return o;



        }
    };
}

要使用它,只需创建一个传递你想要观察的对象的实例,运行你的代码,然后调用done()方法,该方法返回并使用已创建和删除已更改内容的地图来对象。

check = new objectWatch(window);
x = 1;
y = 1;
console.log(check.done());

---> object: {created: {x: 1, y:1, check:object}, removed:{}}

<强>小提琴

http://jsfiddle.net/L6Lb35nq/

答案 1 :(得分:0)

由于所有JS变量都默认为undefined,如果您说术语已分配,则之前的答案不准确:

function isGloballyDefined(varName) {
   return window[varName] !== undefined 
}

如果变量具有nullfalse值,则它已由某段代码分配。

由于您没有指定上下文,因此根据您运行此代码的位置,window对象可能不可用,因此如果您想在节点上下文中使用它,那么您可能希望查看对于global对象中的变量。

希望这有帮助。