2011-10-31 35 views
0

在实际询问任何事情之前,我会继续说这是一个理论问题;但是,稍后可能会在网站上实施。在本地范围内暂时替换全局变量

无论如何,我有一个变量,任何变量。假设它是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,关于米兰Jaric的答案。

在此先感谢!

回答

1

这就是我一直在寻找...现在,前你以为我在问之前已经有了答案,我没有,我只能根据Milan Jaric的答案达成切实的解决方案(谢谢btw)。

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) 

(我从来没有真正说过什么可以或不可以去功能)。

+0

这不是我理解你在原始问题中提出的问题。你正在做的是传递一个对被赋予'a.other'的对象的引用,你问如何阻止访问全局* a *,但仍然引用它的属性。 – RobG

+0

@RobG:当你看这个代码和单独的代码时,它几乎是一样的。我只需要访问*一个*属性,然后在那里访问它;另外,可以防止访问其他'a'属性/方法。此外,真的没有别的办法。事情不是不可能的*。 – JCOC611

+0

尽管发现由* ab *引用的对象实际上是由* ab *引用的,所以对其他* a *属性的访问完全不被阻止,需要几次猜测,并且考虑到一些假设(即, ,默默无闻的安全不是一个合理的政策)。 – RobG

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

好的,我会让游戏更有趣。让我们说.. ..只是说,我在函数内部做了这个:'var a = window.a.other,window = null'。 (我不能允许窗口访问...)在那里的任何解决方法? – JCOC611

+0

:)想... –

+0

有这个实例也可以使用,但我看到你已经改变了你的答案功能签名,好想法:) –

1

假设它是一个,它的范围是全球性的。

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

...特定的功能,我想该变量的值设置为其他比它的全球价值 的东西,但在此基础上,如果没有 全球范围内改变其值。

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

[剪断代码]

与上面的代码的问题是,当我在 功能定义一个变种,它已经在本地设置之前,清除了全球一 的价值;

该代码不以任何方式“清除”a的值。它创建一个局部变量a,以便标识符a将解析为该变量,而不是全局的a。为了区分betweent两个,你可以访问全球a作为全局对象的属性:

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

再次,仍然应该是(因此使用另一个变量名称不是 选项,或在至少不是理想的)。事实上,全球a应 不能从函数hello访问。

不可能的,尽管它可能在ES5严格模式下几乎可以提供的代码试图访问全球一个是另一个函数内并不能得到全局对象的引用。

但我认为你不能保证。