2012-04-02 58 views
3

如果我執行以下:Javascript/ECMAscript/Spidermonkey:範圍與此?

var scopes = []; 
scopes.push(this); 
var x = "123"; 
function foo() {} 

(function() { 
    var y = "456"; 
    function bar() {} 
    scopes.push(this); 
})(); 

scopes對象包含全局對象的兩個相同拷貝,並且兩個foo()x被定義爲全局對象的屬性。

但是ybar()定義在本地範圍內。有什麼方法可以獲得對這個範圍對象的引用嗎?如果沒有,是否有任何方法在該範圍內以編程方式定義對象?

例如,在全球範圍內,我可以做到這一點:

this.wham = "789"; 
this.baz = function() { return 2; } 
var vname = 's'; 
this[vname] = "Dynamic name!" 

,我可以通過whambaz()s訪問它們。

如果我有這樣的對象:

var obj = {name: 'ha', value: 3}; 

我正在尋找一種方式來定義其名稱等於obj.name等於內容和值的局部範圍變量obj.value的內容,假定變量obj在該範圍內可見。

這可能嗎?

編輯:用例如下 -

function define_in(scope, name, value) 
{ 
    scope[name] = value; 
} 

(function() { 
    define_in(?????, 'x', "super"); 
    var y = x + " powered"; // would like to get "super powered" 
})(); 
+1

我不確定我是否理解你的問題,但要澄清「this」的作用:如果一個函數被稱爲成員函數(例如obj.test()),那麼將爲該對象分配「this」 (在我的例子中是obj)的函數範圍。否則它可能是全局對象,或者如果以嚴格模式運行,可能會引發錯誤。簡而言之,僅僅因爲你處於不同的可變範圍內並不一定意味着「this」將指向當前範圍。 – Sahand 2012-04-02 16:56:10

+0

darnit,這是重複的。我試圖尋找它,我真的這樣做。 – 2012-04-02 16:57:48

+0

[JavaScript:引用函數作爲對象的本地作用域]的可能重複(http://stackoverflow.com/questions/2600361/javascript-reference-a-functions-local-scope-as-an-object) – 2012-04-02 16:58:05

回答

2

有沒有 「本地範圍」 的變量。不幸的是,你需要自己做一個。

(function() { 
    var scope = {}; 
    scope.y = "456"; 
    scope.bar = function(){}; 
    scopes.push(scope); 
})(); 
+0

..或者更糟的是使用'evil'函數......哎呀我的意思是'eval'。 – zzzzBov 2012-04-02 16:57:48

0

而不是使用一個自執行的函數,你可以創建一個函數的構造,並定義對象成員和/或私有成員,讓你選擇什麼樣的揭露,哪些不是,如果這是你在找什麼。