Javascript tilsvarer Pythons lokalbefolkningen ()?

stemmer
19

I Python kan man få en ordbok med alle lokale og globale variabler i dagens omfang med innebygde funksjoner locals()og globals(). Er det noen tilsvarende måte å gjøre dette på Javascript? For eksempel, ønsker jeg å gjøre noe sånt som følgende:

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

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

Er dette i det hele tatt er mulig, eller skal jeg bare bruke et lokalt objekt for oppslag?

Publisert på 02/09/2008 klokken 16:29
kilden bruker
På andre språk...                            


6 svar

stemmer
16

  • lokalbefolkningen () - Nr

  • globals () - Ja.

windower en referanse til den globale omfang, som globals()i python.

globals()["foo"]

er det samme som:

window["foo"]
Svarte 02/09/2008 kl. 18:01
kilden bruker

stemmer
4

Vel, jeg tror ikke at det er noe sånt i JS. Du kan alltid bruke eval i stedet for lokalbefolkningen (). Som dette:

eval(s+"()");

Du må bare vite at faktisk fungerer foo eksisterer.

Redigere:

Ikke bruk eval :) Bruk:

var functionName="myFunctionName";
window[functionName]();
Svarte 02/09/2008 kl. 16:36
kilden bruker

stemmer
3

Jeg synes å huske Brendan Eich kommentert dette i en fersk podcast; hvis jeg husker riktig, er det ikke vurderes, ettersom det gir urimelige restriksjoner på optimalisering. Han sammenlignet det med den argumentslokale i det, mens nyttig for varargs fjerner sin eksistens evnen til å gjette på hva en funksjon vil berøre bare ved å se på sin definisjon.

BTW: Jeg tror JS gjorde ha støtte for å få tilgang lokalbefolkningen gjennom argumentene lokale på en gang - et raskt søk viser dette har blitt frarådet skjønt.

Svarte 02/09/2008 kl. 16:50
kilden bruker

stemmer
0

@pkaeding

Ja du har rett. vinduet [function] () fungerer ikke i dette tilfellet, men eval gjør. Hvis jeg trengte noe sånt som dette, ville jeg lage min egen objekt å holde disse funksjonene sammen.

var func = {};
func.bar = ...;
var s = "bar";
func[s]();
Svarte 02/09/2008 kl. 17:14
kilden bruker

stemmer
0

@ E-Bartek, tror jeg at vinduet [function] vil ikke fungere hvis du i noen nedleggelse, og funksjonsnavnet er lokale til at nedleggelse. For eksempel:

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

I dette tilfellet, er s 'bar', men funksjonen 'bar' eksisterer bare innenfor omfanget av funksjonen 'foo'. Det er ikke definert i vinduet omfang.

Selvfølgelig, dette er ikke egentlig svare på det opprinnelige spørsmålet, jeg ville bare kiming i på dette svaret. Jeg tror ikke det er en måte å gjøre hva den opprinnelige spørsmålet.

Svarte 02/09/2008 kl. 17:00
kilden bruker

stemmer
0

AFAIK, nei. Hvis du bare ønsker å sjekke eksistensen av en gitt variabel, kan du gjøre det ved å teste for det, noe sånt som dette:

if (foo) foo();
Svarte 02/09/2008 kl. 16:41
kilden bruker

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