重构以避免全局泄漏? (下划线js像模式)

时间:2013-12-21 11:51:52

标签: javascript design-patterns refactoring scope mocha

我想模块化一些函数,我想使用像下划线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));

1 个答案:

答案 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
  }