简体   繁体   English

Node.js在for..in循环中泄漏

[英]Node.js leaking for..in loops

I was using a custom made object handling library (for exams, can't use things that I don't program personnaly, ie JS.class) which tends to break scope of functions. 我使用的是一个定制的对象处理库(对于考试,不能使用我不亲自编程的东西,即JS.class),这往往会破坏函数的范围。

File base.js 文件base.js

/**
 * Module internals
 */
function _add() {
    var obj_out = arguments[0];
    for (var i=1; i < arguments.length; i++) { var arg = arguments[i];
        for(prop in arg) { obj_out[prop] = arg[prop]; }
    };
    return obj_out;
}
function _merge() {
    var obj_out = {};
    for (var i=1; i < arguments.length; i++) { var arg = arguments[i];
        for(prop in arg) { obj_out[prop] = arg[prop]; }
    };
    return obj_out;
}
function _args(args) {
    return Array.prototype.slice.call(args, 0);
}
function _filterProps(items, re) {
    console.log("Items: ", items);
    var obj_out = {};
    console.log("Before: ", obj_out);
    var keys = [];
    for(var key in items) {
        keys.push(key);
    }
    console.log("Keys: ", keys);
    for (var i=0; i < keys.length; i++) { var key = keys[i];
        if(!re.test(key)){
            obj_out[key] = items[key];
            console.log("Step: ", obj_out);
        }
    }
    console.log("After: ", obj_out);
    return obj_out;
}

/**
 * Class declaration
 * Usage:
 {
    $extends: <classe parente>
    $include: [<modules>]
    $new: <constructeur>
    $static: <methodes statiques>
    $methods: <methodes>
 }
 */
exports.Class = function(items) {
    var base = !items["$extends"] ? Object.prototype : items["$extends"].prototype;
    var incs = !items["$include"]? [] : items["$include"];
    var stat = !items["$static"] ? {} : items["$static"];
    var meth = !items["$methods"] ? {} : items["$methods"];
    var cons = !items["$new"] ? function(){} : items["$new"];
    var left = _filterProps(items, /^\$/);

    var cls = function() {
        console.log("Constructor");
        console.log(arguments);
        cons.apply(this, _args(arguments));
    };
    cls = _add(cls, stat);
    cls.prototype = base;
    for (var i=0; i < incs.length; i++) {
        _add(cls.prototype, incs[i]);
    };
    _add(cls.prototype, left);
    _add(cls.prototype, meth);

    return cls;
}

File test.js 文件test.js

Base = require('./base');

var SomeClass = Base.Class({
    $new: function() { console.log("new"); },
    foo: function() { console.log("foo"); },
});

var OtherClass = Base.Class({
    $new: function() { console.log("new"); },
    bar: function() { console.log("bar"); }
});

console.log("SomeClass: ", SomeClass.prototype);
console.log("OtherClass: ", OtherClass.prototype);

Output of "node test.js" “ node test.js”的输出

Items:  { '$new': [Function], foo: [Function] }
Before:  {}
Keys:  [ '$new', 'foo' ]
Step:  { foo: [Function] }
After:  { foo: [Function] }
Items:  { '$new': [Function], bar: [Function] }
Before:  {}
Keys:  [ '$new', 'bar', 'foo' ]
Step:  { bar: [Function] }
Step:  { bar: [Function], foo: [Function] }
After:  { bar: [Function], foo: [Function] }
SomeClass:  { foo: [Function], bar: [Function] }
OtherClass:  { foo: [Function], bar: [Function] }

The _filterProps function tends to retain some values in its "for..in" loop and I can't tell why. _filterProps函数趋向于在其“ for..in”循环中保留一些值,我不知道为什么。 And I'm a little lost because javascript is not my forte. 而且我有些迷茫,因为javascript不是我的强项。

My node version is v0.5.8-pre on Max OSX 10.6 我的节点版本是Max OSX 10.6上的v0.5.8-pre

Edit 编辑

Well thanks to Zack Bloom and his ability to see hidden bugs, I discovered that I forgot to copy the "Object.prototype" object so it was referencing it. 很好,感谢Zack Bloom和他看到隐藏的bug的能力,我发现我忘记复制“ Object.prototype”对象,因此它正在引用它。

Thanks, JD 谢谢JD

It looks like you are extending Object.prototype, which will change all objects. 看起来您正在扩展Object.prototype,它将更改所有对象。

base = Object.prototype
cls.prototype = base
_add(cls.prototype, ...)

Even in a loop statement, you have to declare variables you use or they'll become globals. 即使在循环语句中,您也必须声明使用的变量,否则它们将成为全局变量。 Eg change things like 例如更改诸如

for(prop in arg) { obj_out[prop] = arg[prop]; }

to something like

for(var prop in arg) { obj_out[prop] = arg[prop]; }

Edit: Actually, your problem is a different one, but it's still an issue in your code. 编辑:实际上,您的问题是一个不同的问题,但是在您的代码中仍然是一个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM