在实际问什么之前,我会继续说这是一个理论问题;但是,它可能会在以后的网站上实施。
无论如何,我有一个变量,任何变量。假设它是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
覆盖,关于米兰贾里奇的回答。
提前致谢!
答案 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 的代码在另一个函数内部并且无法获取对全局对象的引用。
但我认为你无法保证这一点。