2008-09-02 116 views
19

在Python中,可以通過內置函數locals()globals()獲取當前範圍內所有本地和全局變量的字典。是否有一些在Javascript中做到這一點的等價方法?舉例來說,我想這樣做如下:Python的當地人()的JavaScript等價物?

var foo = function(){ alert('foo'); }; 
var bar = function(){ alert('bar'); }; 

var s = 'foo'; 
locals()[s](); // alerts 'foo' 

這是在所有可能的,或者我應該只使用了查找本地對象?

回答

15
  • 當地人() - 號

  • 全局() - 是的。

window是全球範圍內的參考,就像在python globals()

globals()["foo"] 

是一樣的:

window["foo"] 
+5

僅在實現* window *的瀏覽器或其他主機環境中。 – RobG 2011-12-01 09:06:03

4

嗯,我不認爲在js中有類似的東西。你總是可以使用eval而不是locals()。就像這樣:

eval(s+"()"); 

你一定要知道,真正發揮作用存在。

編輯:

不要使用eval :)使用:

var functionName="myFunctionName"; 
window[functionName](); 
+0

使用窗口對象,只給你訪問到全局,而不是局部變量。 – 2013-10-16 15:01:11

0

AFAIK,沒有。如果你只是要檢查給定變量的存在,你可以通過測試它,像這樣做:

if (foo) foo(); 
+0

只有當變量已被定義時纔會起作用,否則會引發ReferenceError。 – 2015-11-07 00:05:10

3

我似乎記得布蘭登·艾克在最近的播客上這個評論;如果我記得正確的話,這不會被考慮,因爲它增加了不合理的優化限制。他將其與當地的arguments相比較,雖然它對於可變參數非常有用,但它的存在無法通過查看它的定義來猜測函數會觸及什麼。

順便說一句:我相信JS 沒有支持通過本地參數一次訪問本地人 - a quick search顯示這已被棄用,雖然。

0

@ e-bartek,我認爲如果你在某個閉包中,那麼window [functionName]將不起作用,並且函數名稱在閉包中是局部的。例如:

function foo() { 
    var bar = function() { 
     alert('hello world'); 
    }; 
    var s = 'bar'; 
    window[s](); // this won't work 
} 

在這種情況下,s是'bar',但函數'bar'只存在於函數'foo'的範圍內。它沒有在窗口範圍中定義。

當然,這並沒有真正回答原來的問題,我只是想對這個回答進行編纂。我不相信有什麼方法去處理原始問題。

0

@pkaeding

是的,你說得對。 窗口[functionName]()在這種情況下不起作用,但eval。如果我需要這樣的東西,我會創建自己的對象來保持這些功能。

var func = {}; 
func.bar = ...; 
var s = "bar"; 
func[s]();