2012-04-18 34 views
1

我將如何訪問一個家長的功能「VAR」變量在以下情況下(我只能編輯復位功能的定義):如何在JavaScript中訪問父函數閉包?

_.bind(function(){ 
    var foo = 5; 

    var reset = function(){ 
     foo = 6; //this changes foo, 
     bar = 7; //**I want this to add another "var", so I don't pollute global scope 
    } 
    reset(); 
    console.log(foo); //6 
    console.log(bar); //7 
}, window); 

回答

1

很抱歉,但你不能。

您可以訪問命名空間的唯一方法是with語句。

例如,如果你能夠重新寫了整個事情,它可以就像這樣:

_.bind(function(){ 
    var parentNamespace = { 
     foo: 5, 
    }; 

    with (parentNamespace) { 
     var reset = function(){ 
      foo = 6; //this changes foo, 
      parentNamespace.bar = 7; //**I want this to add another "var", so I don't pollute global scope 
     } 
     reset(); 
     console.log(foo); //6 
     console.log(bar); //7 
    } 
}, window); 

但這是最有可能幾乎可以肯定是一個壞主意。

+0

並且只能在scrope中添加obj – 2012-04-18 01:03:58

+0

而'with'是JavaScript中的一個可怕聲明,其原因很充分。 – tkone 2012-04-18 01:04:06

1

這會幫你嗎?

_.bind(function(){ 
    var foo = 5, bar; 

    var reset = function(){ 
     foo = 6; //this changes foo, 
     bar = 7; //**I want this to add another "var", so I don't pollute global scope 
    } 
    reset(); 
    console.log(foo); //6 
    console.log(bar); //7 
}, window); 
+0

這是一個很好的方法。如果你想讓封閉範圍真正可以訪問,你必須在封閉範圍內聲明 – tkone 2012-04-18 01:04:34

+0

是的,這是我現在擁有的方式,我只是因爲所有名稱的重複而感到沮喪。 – QuinnBaetz 2012-04-18 01:37:42

0

我不知道我理解你的問題,所以我的答案可能不是你想要的。

var reset = function(){ 
    foo = 6; 
    reset.bar = 7; 
} 
reset.bar = 13; 
reset(); // reset.bar is back to 7. 
0

ECMA-262 excplicitly阻止訪問函數的變量對象(功能實際上並不必須有一個,他們只需要表現得好像他們這樣做),所以你不能訪問它。

您只能通過在適當的範圍內聲明的變量或包括他們在一個FunctionDeclarationFunctionExpression的正式參數列表,有沒有其他方法添加屬性。

相關問題