我在JavaScript中有一个全局变量(实际上是一个window属性,但我认为它并不重要),该变量已经由先前的脚本填充,但是我不希望另一个脚本稍后运行以查看其值,甚至定义。
window
我已经说过了some_var = undefined,它可以用于测试目的,typeof some_var == "undefined"但是我真的不认为这是正确的方法。
some_var = undefined
typeof some_var == "undefined"
你怎么看?
delete操作者,将删除该对象的属性。它不能删除变量。因此,问题的答案取决于如何定义全局变量或属性。
delete
(1)如果使用创建var,则无法删除。
var
例如:
var g_a = 1; //create with var, g_a is a variable delete g_a; //return false console.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 true console.log(g_b); //error, g_b is not defined
在这种情况下,引用g_a是在ECMAScript规范称为“VariableEnvironment”的情况下创建的,该引用附加到当前作用域-在函数var内部使用的情况下,这可能是函数执行上下文(尽管可能会有些复杂)当您考虑let)或使用“全局”代码时,VariableEnvironment将附加到全局对象(通常是window)。
g_a
let
VariableEnvironment 中的引用通常不可删除-ECMAScript10.5]中详细介绍的过程对此进行了详细说明,但足以说明,除非您的代码在eval上下文中执行(大多数基于浏览器的开发控制台都在使用),否则使用声明的变量var不能被删除。
eval
当尝试在不使用var关键字的情况下为名称分配值时,Javascript尝试在ECMAScript规范称为“LexicalEnvironment ”的位置查找命名的引用,主要区别在于_LexicalEvironment_ 是嵌套的-即 LexicalEnvironment_具有父级( ECMAScript规范称为“外部环境引用”),并且当Javscript无法在 _LexicalEenvironment中 找到引用时,它将在父_LexicalEnvironment中_ 查找(如10.3.1和10.2.2.1中所述)。顶级 LexicalEnvironment 是“全球环境”,并且绑定到全局对象,因为它的引用是全局对象的属性。因此,如果您尝试访问未使用var当前范围或任何外部范围中的关键字声明的名称,则Javascript最终将获取属性该的window对象充当参考。正如我们之前了解到,在对象的属性可以被删除。
a
10
function test() { a = 5; var a = 10; }