В Python можно получить словарь всех локальных и глобальных переменных в текущей области с помощью встроенных функций locals() и globals(). Есть ли какой-нибудь эквивалентный способ сделать это в Javascript? Например, я хотел бы сделать что-то вроде следующего:
var foo = function(){ alert('foo'); };
var bar = function(){ alert('bar'); };
var s = 'foo';
locals()[s](); // alerts 'foo'
Возможно ли это вообще, или я должен просто использовать локальный объект для поиска?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что ж, не думаю, что в js есть что-то подобное. Вы всегда можете использовать eval вместо locals (). Так:
eval(s+"()");
Вам просто нужно знать, что на самом деле функция фу существует.
Редактировать:
Не используйте eval :) Используйте:
var functionName = "myFunctionName";
window[functionName]();
AFAIK, нет. Если вы просто хотите проверить существование заданной переменной, вы можете сделать это, проверив ее, примерно так:
if (foo) foo();
Это будет работать только в том случае, если переменная была определена, в противном случае будет сгенерирована ошибка ReferenceError.
Я, кажется, помню, как Брендан Эйх прокомментировал это в недавнем подкасте; Если я правильно помню, это не рассматривается, так как добавляет необоснованные ограничения к оптимизации. Он сравнил его с локальным arguments в том, что, хотя он полезен для varargs, само его существование лишает возможности угадывать, что функция коснется, просто взглянув на ее определение.
Кстати: я считаю, что JS сделал поддерживает доступ к локальным через локальные аргументы за один раз - быстрый поиск показывает, что это устарело.
@ e-bartek, я думаю, что окно [functionName] не будет работать, если вы находитесь в каком-то закрытии, а имя функции является локальным для этого закрытия. Например:
function foo() {
var bar = function () {
alert('hello world');
};
var s = 'bar';
window[s](); // this won't work
}
В этом случае s - это 'bar', но функция 'bar' существует только внутри области действия функции 'foo'. Это не определено в области видимости окна.
Конечно, это не совсем ответ на исходный вопрос, я просто хотел присоединиться к этому ответу. Я не верю, что есть способ сделать то, что задал исходный вопрос.
@pkaeding
Да, ты прав. окно [имя_функции] () в этом случае не работает, но оценка работает. Если бы мне понадобилось что-то подобное, я бы создал свой собственный объект, чтобы эти функции были вместе.
var func = {};
func.bar = ...;
var s = "bar";
func[s]();
locals () - Нет.
globals () - Да.
window - это ссылка на глобальную область видимости, например globals() в python.
globals()["foo"]
такой же как:
window["foo"]
Только в браузере или другой среде хоста, которая реализует окно.
Это правда. Например, в Node нет возможности сделать это? Думаю, тогда следует внести изменения, так как это общий ответ JavaScript.
когда нет окно, есть Глобальный - stackoverflow.com/q/10984629/596361
Использование объекта window дает вам доступ только к глобальным переменным, но не к локальным переменным.