如何取消设置JavaScript变量?

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

我把some_var=undefined放在这里,它的作用是测试some_var==”的typeof;“未定义”</但是我真的不认为这是正确的方法

你觉得怎么样

delete操作符从对象中删除属性。它不能删除变量。所以这个问题的答案取决于全局变量或属性是如何定义的

(1) 如果它是使用var创建的,则无法删除

例如:

var g_a=1//使用var创建,g_a是一个变量
删除g_a//返回错误
控制台日志(g_a)//g_a仍然是1

(2) 如果创建时未使用var,则可以将其删除

g_b=1//不使用var创建,g_b是一个属性
删除g_b//返回真值
控制台日志(g_b)//错误,未定义g_b

技术说明

1。使用var

在这种情况下,引用g_a是在ECMAScript规范调用的可变环境;这是附加到当前范围的,这可能是在函数中使用 var >代码>的函数执行上下文(尽管当您考虑让/时,它可能会变得更复杂一些),或者在““全球”;编码将VariableEnvironment附加到全局对象(通常是窗口

VariableEnvironment中的引用通常不可删除-ECMAScript 10.5中详细介绍的过程对此进行了详细解释,但足以说明,除非您的代码在eval上下文中执行(大多数基于浏览器的开发控制台都使用该上下文),然后不能删除使用var声明的变量

2。不使用var

当试图在不使用var关键字的情况下为名称赋值时,JavaScript会尝试在ECMAScript规范所调用的&quot词汇环境;,主要区别在于词汇环境是嵌套的,即词汇环境有一个父环境(ECMAScript规范称之为“外部环境引用”),当JavaScript在词汇环境中找不到引用时,它会在父环境中查找词汇环境(详见10.3.1和10.2.2.1)。顶级的词汇环境是“全局环境”,它绑定到全局对象,因为它的引用是全局对象的属性。因此,如果您尝试访问当前范围或任何外部范围中未使用var关键字声明的名称,JavaScript最终将使用fetch一个窗口对象的属性用作该引用。正如我们之前所了解的,可以删除对象上的属性

注释

  1. 重要的是要记住,var声明是“被提升的”——也就是说,它们总是被认为发生在它们所处的范围的开始处——尽管不是在var语句中进行的值初始化——它就在这里s是来自VariableEnvironment的引用,而不是窗口属性,其值将在代码末尾为10

    函数测试(){a=5;var a=10;}
    
  2. 上面的讨论是在未启用“严格模式”的情况下进行的。使用“严格模式”时,查找规则有点不同,如果没有“严格模式”解析为窗口属性,则词汇引用将在“严格模式”下引发“未声明变量”错误。我没有真正理解这是在哪里指定的,但这是浏览器的行为

发表评论