Javascript 相当于 Python 的 locals()?

IT技术 javascript python
2021-03-16 13:53:37

在 Python 中,可以使用内置函数locals()获得当前范围内所有局部和全局变量的字典globals()在 Javascript 中是否有一些等效的方法可以做到这一点?例如,我想做如下事情:

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

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

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

6个回答
  • 当地人() - 没有。

  • globals() - 是的。

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

globals()["foo"]

是相同的:

window["foo"]
在没有,有全球- stackoverflow.com/q/10984629/596361
2021-04-22 13:53:37
这仅适用于顶级范围。如果我想从内部范围调用它怎么办?
2021-04-25 13:53:37
这是真的。例如,在 Node 中没有任何方法可以做到这一点吗?我想它应该是更改,因为这是一个通用的 JavaScript 答案。
2021-04-29 13:53:37
仅在实现window的浏览器或其他主机环境中
2021-05-04 13:53:37

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

eval(s+"()");

你只需要知道实际上函数foo存在。

编辑:

不要使用 eval:) 使用:

var functionName="myFunctionName";
window[functionName]();
使用 window 对象,只能让您访问全局变量,而不是局部变量。
2021-04-29 13:53:37

我似乎记得 Brendan Eich 在最近的播客中对此发表了评论;如果我没记错的话,它没有被考虑,因为它对优化增加了不合理的限制。他将它与arguments局部变量进行了比较,因为虽然对可变参数很有用,但它的存在消除了仅通过查看函数定义就可以猜测函数将接触到什么的能力。

顺便说一句:我相信 JS确实支持一次通过本地参数访问本地人 -快速搜索显示这已被弃用。

AFAIK,没有。如果您只想检查给定变量是否存在,可以通过测试来完成,如下所示:

if (foo) foo();
只有在定义了变量时才有效,否则会抛出 ReferenceError。
2021-05-18 13:53:37

@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' 的范围内。它没有在窗口范围内定义。

当然,这并没有真正回答最初的问题,我只是想附上这个回答。我不相信有办法做最初的问题。