Javascript equivalente de moradores do Python ()?

votos
19

Em Python pode-se obter um dicionário de todas as variáveis locais e globais no escopo atual com as funções internas locals()e globals(). Existe alguma maneira equivalente de fazer isso em JavaScript? Por exemplo, eu gostaria de fazer algo como o seguinte:

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

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

É este possível, ou devo apenas estar usando um objeto local para a pesquisa?

Publicado 02/09/2008 em 17:29
fonte usuário
Em outras línguas...                            


6 respostas

votos
16

  • locals () - No.

  • globals () - Sim.

windowé uma referência para o escopo global, como globals()em python.

globals()["foo"]

é o mesmo que:

window["foo"]
Respondeu 02/09/2008 em 19:01
fonte usuário

votos
4

Bem, eu não acho que há algo parecido em js. Você sempre pode usar eval em vez de moradores (). Como isso:

eval(s+"()");

Você apenas tem que saber que realmente funcionar foo existe.

Editar:

Não use eval :) Use:

var functionName="myFunctionName";
window[functionName]();
Respondeu 02/09/2008 em 17:36
fonte usuário

votos
3

Eu me lembro de Brendan Eich comentou sobre isso em um recente podcast; Se bem me lembro, ele não está sendo considerado, como acrescenta restrições excessivas à otimização. Ele comparou-o para o argumentslocal em que, embora útil para varargs, sua própria existência remove a capacidade de adivinhar o que uma função vai tocar só de olhar para a sua definição.

BTW: eu acredito JS que têm suporte para acessar os locais através dos argumentos locais de uma só vez - uma rápida pesquisa mostra que este foi substituído embora.

Respondeu 02/09/2008 em 17:50
fonte usuário

votos
0

@pkaeding

Sim, você está certo. janela [functionName] () não funciona neste caso, mas eval faz. Se eu precisasse de algo assim, eu criar meu próprio objeto para manter essas funções em conjunto.

var func = {};
func.bar = ...;
var s = "bar";
func[s]();
Respondeu 02/09/2008 em 18:14
fonte usuário

votos
0

@ E-bartek, eu acho que a janela [functionName] não vai funcionar se você em algum fechamento, e o nome da função é local para que o fechamento. Por exemplo:

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

Neste caso, s é 'bar', mas a função 'bar' só existe dentro do âmbito da função 'foo'. Não é definido no âmbito janela.

Claro, isso realmente não responder à pergunta original, eu só queria dialogar sobre esta resposta. Eu não acredito que há uma maneira de fazer o que a pergunta original pediu.

Respondeu 02/09/2008 em 18:00
fonte usuário

votos
0

AFAIK, não. Se você quiser apenas verificar a existência de uma determinada variável, você pode fazê-lo por meio de testes para ele, algo como isto:

if (foo) foo();
Respondeu 02/09/2008 em 17:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more