2010-07-20 35 views
2

我一直在使用javascript ...真的不知道區別。谷歌搜索總是顯示「窗口對象」或「在javascript中打開一個新窗口」的結果,因此無法在其中找到任何內容。window []和eval()之間的區別 - Javascript

eval("v"+e) 
window["v"+e] 

有時窗口對我的作品和在其他時間的eval工程....

那麼什麼的eval()和窗口[]的區別?

雖然對不起新手問題!

諾曼

+2

請問你能說這是一個問題嗎?具體來說,你真的在​​問什麼? – Robusto 2010-07-20 20:55:57

+0

無論答案如何,都不要使用eval! – jasongetsdown 2010-07-20 21:09:17

+0

我認爲這個問題很明顯,就是「請向我解釋情況」。 – Grumdrig 2010-07-20 21:14:31

回答

4

尚未解決的另一點是,eval將解決變量參考使用呼叫者變量環境,例如:

var foo = "global"; 

(function() { 
    var foo = "local"; 
    alert(eval("foo")); // alerts "local" 
    alert(window["foo"]); // alerts "global" 
})(); 

因此,大家可以看看,是不是完全等價。

如果您只是想引用全局變量,我會建議您使用window[prop]方法並避免意外。

+0

所以爲了訪問局部變量使用窗口,否則使用eval? ...爲什麼這麼多人不鼓勵使用eval?是否有另一種方式來訪問像eval(「ev」+ d)這樣的局部變量;當地d = 1,我想訪問本地可變ev1的值? – Norman 2010-07-20 21:49:34

+0

@Norman,使用'window [prop]'來訪問全局變量',參見[this question](http://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-想法)知道爲什麼當你不需要時不應該使用'eval'。 – CMS 2010-07-20 22:00:52

5

的eval()解釋任意JavaScript語句,而與窗口要訪問的窗口對象的屬性。

在您的示例中,您似乎在eval()和window []中都使用了屬性名稱。由於瀏覽器中的全局範圍與窗口對象的範圍相同,因此它們將評估爲相同的內容。

您可以將您的eval("v"+e)聲明等效爲eval("window['v'" + e +" ]")

+0

好吧。但要確保其明確的評估方法是不好的方法;另一種是做這件事的好方法。 – Grumdrig 2010-07-20 21:13:01

+0

是的,eval幾乎總是一個壞主意。 – 2010-07-29 21:17:20

3

兩者都返回一個全局變量的值。區別在於,如果全局變量未定義,那麼在執行eval()時會出錯,而window ['variableName']將返回未定義的(不是錯誤),因爲訪問未定義的屬性不是錯誤,而是訪問未定義的變量是一個錯誤。

+0

**聰明的回答 – mykhal 2010-07-20 21:10:49

1

"v"+e - >串

eval(x) - >評估串x,包含JavaScript表達

window[x] - >返回窗口的具有相同名稱的屬性,作爲x THA值。這實際上可以是一個全局變量

因此,當你有一個全局變量v1 = "foo",並且e = 1,然後eval("v"+e)window["v" + e]都返回「foo」的