Javascript 删除的替代方案?

Javascript 删除的替代方案?,javascript,Javascript,我已经浏览了很多关于JavaScript严格模式的博客文章、文档等 我注意到delete关键字有很多限制。我甚至不知道你是否可以称之为限制。似乎delete不再有效 我喜欢使用严格模式。这是个好主意。但我也认为删除是个好主意 是否有其他方法可以“删除”变量?您不能删除变量 delete用于从对象中删除属性 delete foo.a将从对象foo中删除属性“a” 为什么需要从作用域中删除局部变量?您只需将变量设置为undefined (function(undefined) { // un

我已经浏览了很多关于JavaScript严格模式的博客文章、文档等

我注意到delete关键字有很多限制。我甚至不知道你是否可以称之为限制。似乎
delete
不再有效

我喜欢使用严格模式。这是个好主意。但我也认为删除是个好主意


是否有其他方法可以“删除”变量?

您不能
删除变量

delete
用于从对象中删除属性

delete foo.a
将从对象
foo
中删除属性
“a”

为什么需要从作用域中删除局部变量?您只需将变量设置为
undefined

(function(undefined) {
    // undefined is undefined.
})();

(function() {
    var undefined; // undefined is undefined
})();

另一种检查未定义的引用的方法是执行
foo==void 0
,因为
void
是一个运算符,它在其后运行表达式并返回
undefined
。这是一个聪明的把戏。

将变量设置为
null
?一旦将变量设置为
null
,JavaScript垃圾收集器将在下次运行时删除所有未引用的变量


编辑:正如@chris Buckler在评论中提到的,这不能在全局范围内完成,因为全局变量永远不会被垃圾收集。

正如其他人所暗示的那样,您永远不应该真正需要删除
变量。这听起来更像是没有正确控制范围的问题。如果将变量保留在函数作用域中,一旦不再引用它们,它们将从内存中释放

除了全局
窗口
名称空间之外,您还有其他全局名称空间吗?在这种情况下,这样做可能会使您受益:

(function(global) {

    var Application = {};

    Application.config = { /* config stuff */ };

    global.Application = Application;

})(window);

// if you need to remove config, you can remove it from
// your object and not the window object:
delete Application.config;
要真正深入了解JS中的删除和未定义:


介意告诉我们您的目标吗?就目前而言,这个问题听起来像是在咆哮。听起来他在寻找一个替代delete关键字的方法来删除javascript中的变量……我有一个全局
config
变量,用于配置javascript文件中的某些内容。我想在加载完成后删除它,但它只是抛出一个错误,并将其保留在那里。该行为
delete global.config。在运行脚本之前必须定义config对象。这不会影响我所说内容的适用性。您是否有配置初始化方式的示例?@tylerwashburn如果要从全局范围删除,请从
窗口
对象中删除。全局范围和窗口对象是相同的。只需
delete window.config
执行此操作即可将该值赋值为null,但该变量实际上不会被销毁。@Chris-将其设置为null通常会(如果没有对该变量的更多引用)使其符合GC的条件。不幸的是,根据,这不适用于全局变量,但问题并没有让我们意识到OP指的是一个全局变量。如果您要为(全局中的prop)执行类似于
config
仍将为运行。不建议将变量设置为
undefined
的值,因为在非严格的JS版本中,
undefined
的值可以被操纵。@Eli但您的局部值将为
undefined
对吗?此外,如果您发现一些代码操纵未定义的burn,那么请禁止作者使用JavaScript。我想不出有哪个实例需要它。对于比较,始终建议键入compare而不是value compare:
typeof foo===“undefined”
优于
foo==undefined
。一旦引擎通过确定变量是否可以外部引用来确定不再访问它,就应该对变量进行垃圾收集。这就是为什么适当的范围界定如此重要。它是否未定义并不重要,因为将变量设置为未定义不会破坏它。我强烈建议这样读:@Eli与全局
未定义的
进行比较是不好的做法。与本地
未定义的
进行比较是安全的。我知道这是错误的。但您不能总是阻止bug进入生产环境。我不是凭空得出这些最佳实践的。这已经被聪明的JS工程师一次又一次地推荐了,而且理由充分。我只是想告诉你,其他人是如何避免一开始就遇到这个问题的。