我想模块化一些函数,我想使用像下划线js这样的模式,但是我还得到一个全局泄漏警告。
// simple test use case
var decorate = require('../lib/decorate');
var expect = require('expect.js');
describe('decorate', function() {
it('should wrap', function() {
var arr = []
expect( decorate('dummy').wrapWith(' oOo ') ).to.eql( ' oOo dummy oOo ' );
});
});
现在它传递了mocha --ignore-leaks
但是可以在没有全局泄漏的情况下进行包装吗?
这是基本代码:
// decorate.js
(function () {
// 'use strict'; // not yet
function Decorate(obj) {
this._obj = obj; // FIXME: global leaks _obj
if (!(this instanceof Decorate)){
return new Decorate(this._obj);
}
}
Decorate.prototype.wrapWith = function(wrap) {
return wrap + this._obj + wrap;
}
// export for node or the browser
if (typeof module !== 'undefined') {
module.exports = Decorate;
} else {
window.decorate = Decorate;
}
}.call(this));
答案 0 :(得分:0)
function Decorate(obj) { this._obj = obj; // FIXME: global leaks _obj if (!(this instanceof Decorate)){ return new Decorate(this._obj); } }
您有一些代码可以让您在没有Decorate
的情况下拨打new
,即this
不是Decorate
个实例。如果检测到这种情况,则会显式创建并返回新实例。
但是,无论测试结果如何,您都要在该测试之前创建._obj
属性!您需要在顶部进行测试,如果未将其作为构造函数调用,则立即中止构造函数。
function Decorate(obj) {
if (!(this instanceof Decorate))
return new Decorate(obj); // abort! abort!
this._obj = obj; // Does not leak any more
}