如何取消JavaScript变量?

如何取消JavaScript变量?

我在JavaScript中有一个全局变量(实际上是一个window属性,但我认为这并不重要),该脚本已经由以前的脚本填充,但我不希望另一个稍后运行的脚本看到它的值,甚至不希望它被定义。

我把some_var = undefined它用于测试typeof some_var == "undefined"但我真的不认为这样做是正确的。

你认为如何?


PIPIONE
浏览 399回答 3
3回答

幕布斯7119047

这个delete运算符从对象中移除属性。它不能删除变量。因此,这个问题的答案取决于如何定义全局变量或属性。(1)如果它是与var,不能删除。例如:var g_a = 1; //create with var, g_a is a variable delete g_a; //return falseconsole.log(g_a); //g_a is still 1(2)如果创建时没有var,可以删除。g_b = 1; //create without var, g_b is a property delete g_b; //return trueconsole.log(g_b); //error, g_b is not defined技术解释1.使用var在这种情况下,引用g_a是在ECMAScript规范调用的“可变环境“它附加到当前作用域-这可能是在以下情况下的函数执行上下文:var在一个函数中(尽管当您考虑到这一点时,它可能会变得更复杂一些)。let),或者在“全局”代码的情况下,可变环境附加到全局对象(通常是window).中的引用可变环境中详细说明的过程通常是不可删除的。ECMAScript 10.5详细说明这一点,但只需指出,除非您的代码是在eval上下文(大多数基于浏览器的开发控制台使用上下文),然后使用var无法删除。2.不使用var在不使用var关键字,Javascript试图在ECMAScript规范调用的“词汇环境“,主要的区别是词汇环境s是嵌套的-这是一个词汇环境有一个父类(ECMAScript规范称为“外部环境引用”),以及Javscript无法将引用定位在词汇环境,它看上去像父母词汇环境(详见10.3.1和10.2.2.1)。最高层词汇环境是“全球环境,这是绑定到全局对象的,因为它的引用是全局对象的属性。var关键字在当前作用域或任何外部作用域中,Javascript将最终获取window对象作为该引用。正如我们之前了解到的,可以删除对象上的属性。注记重要的是要记住var声明是“悬挂的”-也就是说,它们总是被认为发生在它们所在的范围的开头-尽管不是在var语句-保留在原来的位置。所以在下面的代码中,a是来自可变环境而不是window属性及其值为10在守则末尾:function test() { a = 5; var a = 10; }上述讨论是在“严格模式”未启用时进行的。在使用“严格模式”时,查找规则有一点不同,而在没有“严格模式”的情况下解析为窗口属性的词法引用会在“严格模式”下引发“未声明变量”错误。我不太明白这是在哪里指定的,但浏览器的行为方式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript