Javascript эквивалент Python locals()?

В Python можно получить словарь всех локальных и глобальных переменных в текущей области со встроенными функциями locals() и globals(). Есть ли какой-то эквивалентный способ сделать это в Javascript? Например, я хотел бы сделать что-то вроде следующего:

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

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

Возможно ли это, или я просто должен использовать локальный объект для поиска?

Ответы

Ответ 1

  • locals() - No.

  • globals() - Да.

window является ссылкой на глобальную область видимости, например globals() в python.

globals()["foo"]

совпадает с:

window["foo"]

Ответ 2

Ну, я не думаю, что в js есть что-то подобное. Вы всегда можете использовать eval вместо locals(). Вот так:

eval(s+"()");

Вам просто нужно знать, что фактически существует функция foo.

Edit:

Не используйте eval:) Использование:

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

Ответ 3

Кажется, я помню, как Брендан Эйч прокомментировал это в недавнем подкасте; если я правильно помню, это не рассматривается, так как добавляет необоснованные ограничения для оптимизации. Он сравнивал его с локальным arguments, в то время как полезный для varargs, его само существование устраняет способность догадываться о том, что функция коснется, просто взглянув на его определение.

BTW: я считаю, что у JS была поддержка для доступа к местным жителям через локальные локальные значения - быстрый поиск показывает, что это устарело хотя.

Ответ 4

AFAIK, no. Если вы просто хотите проверить наличие данной переменной, вы можете сделать это, проверив для нее что-то вроде этого:

if (foo) foo();

Ответ 5

@e-bartek, я думаю, что окно [functionName] не будет работать, если вы в каком-то закрытии, а имя функции является локальным для этого закрытия. Например:

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

В этом случае s является "bar", но функция "bar" существует только внутри области действия функции "foo". Он не определен в области окна.

Конечно, это действительно не отвечает на исходный вопрос, я просто хотел услышать этот ответ. Я не верю, что есть способ сделать то, что задал первоначальный вопрос.

Ответ 6

@pkaeding

Да, ты прав. window [functionName]() не работает в этом случае, но eval делает. Если бы мне понадобилось что-то вроде этого, я бы создал свой собственный объект, чтобы поддерживать эти функции вместе.

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