2011-10-31 64 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嚴格模式下幾乎可以提供的代碼試圖訪問全球一個是另一個函數內並不能得到全局對象的引用。

但我認爲你不能保證。