2008-09-02 159 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]();