Эквивалент Python locals () в JavaScript?

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

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
23
0
13 644
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

eval(s+"()");

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

Редактировать:

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

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

Использование объекта window дает вам доступ только к глобальным переменным, но не к локальным переменным.

Sebastian Noack 16.10.2013 19:01

AFAIK, нет. Если вы просто хотите проверить существование заданной переменной, вы можете сделать это, проверив ее, примерно так:

if (foo) foo();

Это будет работать только в том случае, если переменная была определена, в противном случае будет сгенерирована ошибка ReferenceError.

Chris W. 07.11.2015 03:05

Я, кажется, помню, как Брендан Эйх прокомментировал это в недавнем подкасте; Если я правильно помню, это не рассматривается, так как добавляет необоснованные ограничения к оптимизации. Он сравнил его с локальным 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"]

Только в браузере или другой среде хоста, которая реализует окно.

RobG 01.12.2011 13:06

Это правда. Например, в Node нет возможности сделать это? Думаю, тогда следует внести изменения, так как это общий ответ JavaScript.

sverrejoh 05.12.2011 16:53

когда нет окно, есть Глобальный - stackoverflow.com/q/10984629/596361

Mirzhan Irkegulov 27.09.2012 14:47

Другие вопросы по теме