在本地范围内临时替换全局变量

时间:2011-10-31 02:15:38

标签: javascript variables scope

在实际问什么之前,我会继续说这是一个理论问题;但是,它可能会在以后的网站上实施。

无论如何,我有一个变量,任何变量。假设它是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覆盖,关于米兰贾里奇的回答。

提前致谢!

3 个答案:

答案 0 :(得分:3)

可以使用窗口对象访问每个全局,稍微更改代码就是示例

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();

答案 1 :(得分:1)

这就是我所寻找的...现在,在你认为我得到答案之前我没有,我没有,我只能根据米兰贾里奇的答案达成一个切实的解决方案(谢谢顺便说一下)。

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)

(我从未真正说出能够或不能超出功能的内容)。

答案 2 :(得分:1)

  

让我们说它是a,它的范围是全球性的。

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

  

...对于特定的函数,我想将该变量的值设置为   除了它的全球价值之外的东西,但基于它,没有   在全球范围内改变其价值。

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

[snipped code]

  

上面代码的问题是当我在中定义var 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(所以使用另一个变量名不是   选项,或至少不是理想选项)。事实上,全球应该   无法从函数hello访问。

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

但我认为你无法保证这一点。