Ответ 1
-
locals() - No.
-
globals() - Да.
window
является ссылкой на глобальную область видимости, например globals()
в python.
globals()["foo"]
совпадает с:
window["foo"]
В Python можно получить словарь всех локальных и глобальных переменных в текущей области со встроенными функциями locals()
и globals()
. Есть ли какой-то эквивалентный способ сделать это в Javascript? Например, я хотел бы сделать что-то вроде следующего:
var foo = function(){ alert('foo'); };
var bar = function(){ alert('bar'); };
var s = 'foo';
locals()[s](); // alerts 'foo'
Возможно ли это, или я просто должен использовать локальный объект для поиска?
locals() - No.
globals() - Да.
window
является ссылкой на глобальную область видимости, например globals()
в python.
globals()["foo"]
совпадает с:
window["foo"]
Ну, я не думаю, что в js есть что-то подобное. Вы всегда можете использовать eval вместо locals(). Вот так:
eval(s+"()");
Вам просто нужно знать, что фактически существует функция foo.
Edit:
Не используйте eval:) Использование:
var functionName="myFunctionName";
window[functionName]();
Кажется, я помню, как Брендан Эйч прокомментировал это в недавнем подкасте; если я правильно помню, это не рассматривается, так как добавляет необоснованные ограничения для оптимизации. Он сравнивал его с локальным arguments
, в то время как полезный для varargs, его само существование устраняет способность догадываться о том, что функция коснется, просто взглянув на его определение.
BTW: я считаю, что у JS была поддержка для доступа к местным жителям через локальные локальные значения - быстрый поиск показывает, что это устарело хотя.
AFAIK, no. Если вы просто хотите проверить наличие данной переменной, вы можете сделать это, проверив для нее что-то вроде этого:
if (foo) foo();
@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
Да, ты прав. window [functionName]() не работает в этом случае, но eval делает. Если бы мне понадобилось что-то вроде этого, я бы создал свой собственный объект, чтобы поддерживать эти функции вместе.
var func = {};
func.bar = ...;
var s = "bar";
func[s]();