1

我试图创建一个可以在实例化时自行删除的方法。经过几次失败的尝试,我最终写了这个邪恶rem()

var g = function () {
  this.rem = function () {
    var _instance = this;
    setTimeout(function () {
      console.log('_instance before:', _instance, 'scope:', this);
      delete _instance;
      console.log('_instance after:', _instance);
    }, 10);
    return this;
};
return this;
}

我知道它看起来很丑。但这对我来说有点奇怪,这也不起作用。在匿名函数内部,作用域window_instance变量似乎也引用了所需的实例。

var t = new g();

t.rem();

输出:

_instance before: g {asdf: 3, rem: function}, scope: Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

_instance after: g {asdf: 3, rem: function}

它不工作的原因是什么?

谢谢。

4

2 回答 2

1

你有没有尝试过这样的事情?

function myFunction() {
    // do the actions
    delete myFunction;
};

myFunction();
于 2013-05-16T12:22:32.963 回答
1

不幸的是,你的方法行不通。当您删除 _instance 时,您删除的是对对象的引用,而不是对象本身。还有另一个对同一对象 (t) 的引用,因此该对象不会被浏览器垃圾收集。而不是t.rem();你应该只使用t = null;并且浏览器将在适当的时候删除该对象(假设没有其他对它的引用)。

于 2013-05-16T12:23:40.187 回答