临时替换局部作用域中的全局变量

Replace a global variable temporarily in a local scope

本文关键字:全局变量 作用域 替换局      更新时间:2023-09-26

在问任何问题之前,我先说这是一个理论问题;但是,它可能会在以后的网站上实现。

总之,我有一个变量,任何变量。假设它是a,它的作用域是全局的。现在,对于一个特定的函数,我想将该变量的值设置为与全局值不同的值,但是基于它,并且不改变的全局值。例如:

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = a.other; // Foo
  a.something; // Undefined
}
a.something; // Safe
a.other; // Foo

上面代码的问题是,当我在函数中定义var a时,它将在设置之前已经在本地清除全局a的值;换句话说,它将返回类似Can't access property [other] of undefined [a]的内容。

同样,a应该仍然是a(所以使用另一个变量名不是一个选项,或者至少不是理想的)。事实上,全局a 不应该被函数hello访问

编辑: window也将被null覆盖,关于米兰贾里奇的回答。

提前感谢!

每个全局变量都可以使用窗口对象访问,只需稍微更改代码,下面是示例

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = window.a.other; // Foo
  console.log(window.a.something); // Safe
}
a.something; // Safe
a.other; // Foo
hello();

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = this.a.other; // Foo
  delete a;
  console.log(this.a.something); // Safe
}
a.something; // Safe
a.other; // Foo
hello();

这就是我要找的…现在,在你认为我在问之前有答案之前,我没有,我只能根据米兰·贾里奇的回答达成一个切实的解决方案(顺便说一句)。

a = {something: "Safe", other: "Foo"}
function hello(b){
  var window = null;
  var a = b; // a.other;
  a.something; // Undefined
}
a.something // Safe
a.other // Foo
hello(a.other)

(我从来没有真正说过什么可以或不可以在函数之外)。

假设它的作用域是全局的

你的意思是"a是一个全局变量"。

…对于一个特定的函数,我想把这个变量的值设为不是全局值,而是基于全局值,而不是全局值修改全局值

不可能的。你可以在作用域链上创建一个具有相同名称的变量,但是你不能有条件地创建变量对象的属性(即用于作用域链上标识符解析的对象)。你只能声明局部变量,这意味着它们在任何代码运行之前就存在,因此不能是有条件的,或者你可以直接赋值给一个未声明的标识符,此时它将成为一个全局变量。

(剪掉代码)

上面代码的问题是,当我在函数时,它将已经清除全局变量a的值

代码没有以任何方式"清除"a的值。它创建了一个局部变量a,这样标识符a将解析为该变量,而不是全局的a。为了区分这两者,您可以将全局a作为全局对象的属性访问:

var a = 'whatever';
var myFunction = (function(global) {
  return function() {
    var a;    // local a
    global.a; // global a
  }
}(this));

同样,a仍然应该是a(所以使用另一个变量名不是a)选项,或者至少不是理想的选项)。事实上,全球a应该不能从hello.

函数访问

不可能,尽管在ES5严格模式下几乎是可能的,前提是试图访问全局的代码在另一个函数中,并且无法获得对全局对象的引用。