Javascript эквивалент локальных Python ()? - PullRequest
21 голосов
/ 02 сентября 2008

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

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

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

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

Ответы [ 6 ]

17 голосов
/ 02 сентября 2008
  • местные жители () - №

  • globals () - Да.

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

globals()["foo"]

совпадает с:

window["foo"]
4 голосов
/ 02 сентября 2008

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

eval(s+"()");

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

Edit:

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

var functionName="myFunctionName";
window[functionName]();
3 голосов
/ 02 сентября 2008

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

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

0 голосов
/ 02 сентября 2008

@ pkaeding

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

var func = {};
func.bar = ...;
var s = "bar";
func[s]();
0 голосов
/ 02 сентября 2008

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

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

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

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

0 голосов
/ 02 сентября 2008

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

if (foo) foo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...