在全局函数内部删除对其自身的引用是一种不好的做法吗?

3
考虑一下这段 JavaScript 代码...
(function() {

    window.myNameSpace_callback = function() {
        // Do whatever.
        delete window.myNameSpace_callback;
    };

    // Assume this does not return JSON, but has JavaScript code to be executed
    // and also calls a user defined callback.
    $.getScript('http://someapi.com/?callback=myNameSpace_callback');

})();

jsFiddle

上面我使用的jQuery库与问题无关。

delete行之后,全局变量就不存在了。我这样做是为了让这个全局变量只在必要时存在。

然而,从全局对象中删除一个属性,而该属性恰好是当前正在运行的函数,这种做法是否不好?


1
我并没有看到它有什么特别的问题 - 除了人们可能对可变全局变量的任何争论之外。当函数开始运行时,对它的引用已经从全局对象中检索出来,因此在那之后不再使用那里的属性。 - hmakholm left over Monica
2
我认为这是因为对我来说,它表明所使用的方法要么“太过巧妙”,要么“不符合惯用法”。 - user166390
嗯,删除它的目的是什么? - Šime Vidas
@Šime 这是一个“一次性使用”的函数,而且必须在全局范围内,因为它必须如此。 - alex
@alex 我明白了。所以我猜想这个想法是为了释放一些浏览器的内存,对吗? - Šime Vidas
显示剩余2条评论
1个回答

4

这样做没有任何问题。

delete关键字只会移除引用,而不是函数本身。在Javascript中,你不能完全摧毁一个对象;你只能移除所有对它的引用。垃圾回收会处理剩余部分。

所以,在函数所在的引用上调用delete并不会有影响,因为你只是从window命名空间中移除了对它的引用。只要你仍然引用它,该函数就仍然存在。

window.myNameSpace_callback = function() {
    delete window.myNameSpace_callback;

    // We deleted the reference to the function off the window namespace,
    // but we can still access it using arguments.callee
    window.myNameSpace_callback_two = arguments.callee;
}; 

myNameSpace_callback();

myNameSpace_callback(); // Error, but what about...

myNameSpace_callback_two();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接