JavaScript: riferimento a funzioni ambito locale come object

Quando chiamo una funzione, viene impostato un ambito locale per quella chiamata. C’è un modo per fare riferimento direttamente a quell’ambito come un object? Proprio come la finestra è un riferimento per l’object di ambito globale.

Esempio:

function test(foo){ var bar=1 //Now, can I access the object containing foo, bar, arguments and anything //else within the local scope like this: magicIdentifier.bar } 

In alternativa, qualcuno ha un elenco completo di ciò che è nello scope locale in cima alle variabili personalizzate?

Contesto: sto cercando di passare a un modo di passare completamente allo scope globale da una chiamata di funzione, l’istruzione with è uno scherzo, la chiamata funziona un po ‘meglio, ma si interrompe ancora per qualsiasi cosa dichiarata nell’ambito della funzione ma non in ambito globale, quindi vorrei dichiarare questi pochi casi in ambito globale, ma ciò richiede che io sappia cosa sono. La funzione IE execScript esegue uno spostamento completo, ma questo risolve solo il problema di IE.

Nota: per chiunque carichi JavaScript in modo dinamico, setTimeout(code,1) è un trucco semplice e efficace per raggiungere l’ambito globale, ma non verrà eseguito immediatamente.

No, non c’è modo di fare riferimento all’object variabile del contesto di esecuzione di una funzione object vincolante dell’ambiente variabile del contesto di esecuzione (che è ciò che viene chiamato quella cosa [ora, quindi la barra], i dettagli in §10.3 della specifica ) . Puoi accedere alla vista limitata solo con arguments (il che è davvero molto limitato).

Di solito, quando volevo farlo, ho appena messo tutto ciò che volevo su un object e poi l’ho usato (ad esempio, lo ho passato in una funzione). Ovviamente, tutte le funzioni create nel contesto hanno accesso a tutto ciò che è nel campo in cui vengono create, in quanto “chiudono” il contesto; altro: le chiusure non sono complicate .

So che è molto tardi, e probabilmente non sei nemmeno più un po ‘interessato, ma ero interessato anche alla fattibilità di questo e dovresti essere in grado di fare un lavoro di qualche tipo usando:

 (function(global) { var testVar = 1; global.scope = function(s) { return eval(s); } })(this); 

quindi in esecuzione:

 scope('testVar'); // 1 

restituisce la variabile dall’interno della chiusura. Non particolarmente bello, ma teoricamente ansible avvolgerlo in un object, magari usando qualche validazione e getter e setter se ne hai bisogno?

Modifica : dopo aver riletto la domanda, presumo che tu voglia accedervi senza dover specificare una funzione nello scope stesso, quindi probabilmente non è applicabile. Lascerò questo qui comunque.

Alcune versioni di Netscape avevano una proprietà magica nell’object arguments che faceva ciò che stai cercando. (Non riesco a ricordare come si chiamava)

Che ne pensi di qualcosa del genere?

  

se si desidera spostare l’ambito della funzione su qualsiasi object, è ansible utilizzare la libreria di sottolineatura con _.bind

Nel tuo caso:

 var fn = _.bind(function(){ console.log(this == window) },window) fn() // true 

Non hai bisogno di una parola chiave per fare riferimento a una variabile nell’ambito locale, perché è l’ambito in cui ti trovi .