2010-02-25 73 views
14

可能重複:
How can I access local scope dynamically in javascript?的Javascript:其名稱可以訪問在封閉的局部變量或變量

大家好。
我們都知道你可以使用[]語法通過它的名稱訪問JavaScript對象的屬性。 OB [ 'nameOfProperty']。

你可以做同樣的局部變量嗎?另一個回答here建議答案是使用window ['nameOfVar']。但是,這隻適用於海報,因爲他是在窗口範圍內定義變量的。

我認爲這一定是可能的,因爲Firefox的Firebug(我相信是用javascript編寫的)可以顯示局部變量和閉包變量。有沒有我不知道的一些隱藏的語言功能?

具體而言,這裏就是我想要做的:

var i = 4; 
console.log(window['i']); // this works.. 

function Func(){ 
    var j = 99; 

    // try to output the value of j from its name as a string 
    console.log(window['j']); // unsurprisingly, this doesn't work 
} 

Func(); 
+1

請參閱http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript – 2010-02-25 19:16:29

+0

你也可以看看http://stackoverflow.com/questions/ 1119335/javascript-local-variable-declare http:// stackoverflow。com/questions/598878/how-can-i-access-local-scope-dynamic-in-javascript – 2010-02-25 18:42:19

回答

13

我不知道任何內置JavaScript的引用這樣的局部變量(儘管可能應該考慮所有變量都由內部引用的字符串)。

我建議保持所有變量中的對象,如果你真的需要訪問的字符串:一種程序錯誤的我,有沒有辦法像你想這樣做:

var variables = { 
    "j": 1 
}; 
alert(variables["j"]); 

更新。變量的內部是聲明性環境記錄中的可變綁定。屬性通過對象的環境記錄綁定到它們屬於的對象,但實際上有一種方法可以使用括號來訪問它們。不幸的是,沒有辦法以相同的方式訪問聲明性環境記錄。

+0

鮑勃,也讓我感到害怕。事實上,EcmaScript理論上支持這一點,但實現(JavaScript)不支持。 – 2013-04-30 16:11:57

7

訪問與窗口或其他任何全球訪問的變量將不能工作,因爲變量不是全局訪問。但是你可以使用可以使用eval來評估任何表情:

<script> 
function test(){ 
    var j = 1; 
    alert(eval("j")); 
} 

test(); 
</script> 
+0

感謝潘。我想我應該更清楚的問題,並說沒有使用eval。 :-)看起來像這是做我想要的而不修改模式的唯一方法。 – 2010-02-26 10:30:01

2

沒有,因爲變量是包含變量的作用域的執行上下文中才能訪問。

換句話說,您可以訪問j的唯一方法是,如果您通過test範圍內的內容訪問它 - 通過內部函數或其他任何方式訪問它。這是因爲在某種意義上,j不存在於範圍更廣的對象,比如全局對象。否則,變量名稱將不得不全球唯一。

2

什麼:

<script> 
    function Func(){ 
     var fn = arguments.callee; 
     fn.j = 99; 
     console.log(fn['j']); 
    } 
    Func(); 
    console.log(window['j']); //not global 
    console.log(Func['j']); //but not private 
</script> 
+0

由於Func不是一個對象,它指向全局對象。你實質上是在說窗口['j'] – Bob 2010-02-25 19:10:06

+0

@Bob,你是否在嘗試之前先試用它?因爲它有效。 – Mic 2010-02-25 19:21:33

+0

@Bob,好吧,我明白了,你是對的 – Mic 2010-02-25 19:25:46

2

沒有,這是不可能的一般。 JavaScript使用範圍鏈解析函數內的標識符;沒有單個對象包含範圍內的所有變量,並且範圍鏈中的對象無法從頁面中運行的JavaScript訪問。