当前位置: 首页 > 面试题库 >

如何取消设置JavaScript变量?

苏宏峻
2023-03-14
问题内容

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

我已经说过了some_var = undefined,它可以用于测试目的,typeof some_var == "undefined"但是我真的不认为这是正确的方法。

你怎么看?


问题答案:

delete操作者,将删除该对象的属性。它不能删除变量。因此,问题的答案取决于如何定义全局变量或属性。

(1)如果使用创建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

技术说明

1.使用 var

在这种情况下,引用g_a是在ECMAScript规范称为“VariableEnvironment”的情况下创建的,该引用附加到当前作用域-在函数var内部使用的情况下,这可能是函数执行上下文(尽管可能会有些复杂)当您考虑let)或使用“全局”代码时,VariableEnvironment将附加到全局对象(通常是window)。

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

2.不使用 var

当尝试在不使用var关键字的情况下为名称分配值时,Javascript尝试在ECMAScript规范称为“LexicalEnvironment ”的位置查找命名的引用,主要区别在于_LexicalEvironment_ 是嵌套的-即 LexicalEnvironment_具有父级(
ECMAScript规范称为“外部环境引用”),并且当Javscript无法在 _LexicalEenvironment中
找到引用时,它将在父_LexicalEnvironment中_ 查找(如10.3.1和10.2.2.1中所述)。顶级 LexicalEnvironment 是“全球环境”,并且绑定到全局对象,因为它的引用是全局对象的属性。因此,如果您尝试访问未使用var当前范围或任何外部范围中的关键字声明的名称,则Javascript最终将获取属性该的window对象充当参考。正如我们之前了解到,在对象的属性可以被删除。

笔记

  1. 重要的是要记住,var声明是“悬挂的”-即始终认为它们发生在它们所作用域的开头-尽管不是var语句中可能完成的值初始化-保留在声明所在的位置。因此,在下面的代码中,a是来自 VariableEnvironment 的引用,而不是该window属性的引用,并且其值将10位于代码的末尾:

function test() { a = 5; var a = 10; }

  1. 上面的讨论是在未启用“严格模式”的情况下。使用“严格模式”时,查找规则略有不同,如果没有“严格模式”,则解析为窗口属性的词法引用将在“严格模式”下引发“未声明变量”错误。我不太了解在哪里指定它,但是它在浏览器中表现如何。


 类似资料:
  • 问题内容: 如何使用jQuery设置和取消设置Cookie,例如创建一个名为的Cookie 并将其值设置为? 问题答案: 2019年4月更新 Cookie的读取/操作不需要jQuery,因此请不要使用下面的原始答案。 转到https://github.com/js-cookie/js-cookie,然后在其中使用不依赖jQuery的库。 基本示例: 有关详细信息,请参见github上的文档。 参见

  • 问题内容: 我正在发出一个ajax请求并将响应存储在一个隐藏字段中。我正在使用getelementbyid.value通过javascript进行此操作。此javascript函数在body onload上。现在获得此值后,我想在C#中使用它我不能有任何按钮onclick事件或任何此类事件,只能有一个隐藏的输入类型 问题答案: 如果一个asp.net HidenField webControl具有

  • 问题内容: 如何在Java中的long的特定位置设置/取消设置位? 例如, 我想在位置2设置位,在位置3取消设置位,因此相应的long将是, 有人可以帮我怎么做吗? 问题答案: 要设置一点,请使用: 擦除一下使用: 切换一下用途: 请注意,我使用0b?。您也可以使用任何整数,例如: 但是,这使得更难知道正在更改哪个位。 使用二进制可让您查看将要设置/擦除/切换的确切位。 要动态设置位,请使用: 将

  • 我正试图用Windows10中的netbeans远程访问我的树莓,但有一个像这张图片的报告。我收到以下错误,我不明白。我看到一些X11显示变量需要设置,但是我应该给它什么值,怎么给?我曾经试过和XMING在一起,但还是一样。

  • 问题内容: 我有一个这样的课: 在我的Spark驱动程序中,我像这样设置名称并调用命令: 但是,我得到一个。如何将值传递给全局变量并使用它? 问题答案: 好的,基本上有两种方法可以将执行者已知的值带给执行者: 将值放在闭包中,然后序列化到执行程序以执行任务。这是最常见的一种,非常简单/优雅。示例和文档 在这里 。 用数据创建一个广播变量。这对于大容量的不可变数据很有用,因此您要保证仅发送一次。如果

  • 我希望能够在Android上使用标签技术在MIFARE Ultralight EV1(MFOUL21)标签上设置和取消设置密码保护。 我知道我会使用<code>nfcA。tranceive()方法,但我不确定该方法的参数是什么,所以有人可以提供代码段来设置和取消设置密码吗? 更新: 关于 TapLinx 库,我基本上希望 代码片段等同于: