在Python中,可以使用内置函数locals()
和globals()
获取当前作用域中所有局部变量和全局变量的字典。在Javascript中有一些相同的方法吗?例如,我想做类似以下的事情:
var foo = function(){ alert('foo'); };
var bar = function(){ alert('bar'); };
var s = 'foo';
locals()[s](); // alerts 'foo'
这是否可能,或者我应该只使用本地对象进行查找?
答案 0 :(得分:17)
当地人() - 没有。
globals() - 是的。
window
是对全局范围的引用,如python中的globals()
。
globals()["foo"]
与:
相同window["foo"]
答案 1 :(得分:4)
嗯,我不认为js中有类似的东西。您始终可以使用eval而不是locals()。像这样:
eval(s+"()");
你只需要知道实际上存在函数 foo 。
修改强>
不要使用eval :)使用:
var functionName="myFunctionName";
window[functionName]();
答案 2 :(得分:3)
我似乎记得Brendan Eich在最近播客中对此发表了评论。如果我没记错的话,它没有被考虑,因为它增加了对优化的不合理限制。他将其与arguments
局部进行了比较,虽然对于varargs很有用,但它的存在消除了通过查看其定义来猜测函数将触及的能力。
顺便说一句:我相信JS 确实支持通过本地参数一次访问本地人 - a quick search表示这已被弃用。
答案 3 :(得分:0)
AFAIK,没有。如果你只是想检查一个给定变量的存在,你可以通过测试它来做到这一点,如下所示:
if (foo) foo();
答案 4 :(得分:0)
@ e-bartek,我认为如果你在某个闭包中,那个窗口[functionName]将不起作用,并且函数名是该闭包的本地。例如:
function foo() {
var bar = function () {
alert('hello world');
};
var s = 'bar';
window[s](); // this won't work
}
在这种情况下,s是'bar',但函数'bar'仅存在于函数'foo'的范围内。它没有在窗口范围中定义。
当然,这并没有真正回答原来的问题,我只是想对这个回应表示感谢。我不相信有办法解决原问题。
答案 5 :(得分:0)
@pkaeding
是的,你是对的。 window [functionName]()在这种情况下不起作用,但 eval 会起作用。如果我需要这样的东西,我会创建自己的对象来保持这些功能。
var func = {};
func.bar = ...;
var s = "bar";
func[s]();