相当于Python的locals()的Javascript吗?

时间:2020-03-05 18:46:34  来源:igfitidea点击:

在Python中,我们可以使用内置函数locals()globals()获取当前范围内所有局部变量和全局变量的字典。是否有某种等效的方式在Javascript中执行此操作?例如,我想执行以下操作:

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

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

这是完全可能的,还是我应该只使用本地对象进行查找?

解决方案

回答

好吧,我不认为js中有类似的东西。我们可以始终使用eval代替locals()。像这样:

eval(s+"()");

我们只需要知道实际的功能foo存在。

编辑:

不要使用eval :)使用:

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

回答

AFAIK,不。如果只想检查给定变量的存在,可以通过测试它来完成,如下所示:

if (foo) foo();

回答

我似乎记得Brendan Eich在最近的播客中对此发表了评论。如果我没记错的话,就不会考虑它,因为它给优化添加了不合理的限制。他将其与local的" arguments"进行了比较,尽管它对varargs很有用,但它的存在消除了仅通过查看其定义来猜测函数将要触摸的内容的能力。

顺便说一句:我相信JS确实支持一次通过local参数访问locals的功能,但是一次快速搜索显示它已被弃用。

回答

@ 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"的范围内。未在窗口范围内定义。

当然,这并不能真正回答最初的问题,我只是想了解一下此回复。我不认为有办法解决原始问题。

回答

@pkaeding

你是对的。 window functionName在这种情况下不起作用,但eval起作用。如果我需要类似的东西,我将创建自己的对象以将这些功能保持在一起。

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

回答

  • locals()-否。
  • globals()-是的。

window是对全局范围的引用,就像python中的globals()一样。

globals()["foo"]

是相同的:

window["foo"]