2015-12-06 6 views
5

Quale meccanismo consente a una funzione JavaScript di fare riferimento a arguments dal relativo chiamante con il nome della funzione chiamante e perché è ancora nella lingua?Perché in JavaScript è possibile fare riferimento agli argomenti in un chiamante?

stavo guardando l'ottimizzazione chiamata coda (o meglio la sua mancanza) nel V8 e sono imbattuto in questo post (https://code.google.com/p/v8/issues/detail?id=457)

esempio di Erik Corry è riportata qui sotto

function foo(x) { 
    return bar(x + 1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

foo(1) 

In un primo momento ho pensato che forse il richiamo di una funzione imposta il suo campo arguments come una sorta di strano effetto collaterale globale, ma sembra durare solo per la durata della chiamata.

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

console.log(foo(1)); // prints '1' 
console.log(foo.arguments); // prints 'null' 

Perché questo comportamento è nella lingua? È utile per qualsiasi cosa oltre alla retrocompatibilità?

EDIT:

non chiedo sull'utilizzo arguments riferirsi alla pseudo-matrice di argomenti nel corpo funzione corrente, ad esempio

function variadic() { 
    for (var i = 0; i < arguments.length; i++) { 
     console.log("%s-th item is %s", i, JSON.stringify(arguments[i])); 
    } 
} 

variadic(1, 2, 3, 4, 5, []); 

sto chiedendo sull'utilizzo somefunction.arguments per riferirsi a arguments di un chiamante.

+0

In Javascript è possibile chiamare una funzione con qualsiasi numero di argomenti, indipendentemente dal numero di argomenti elencati. Le funzioni JavaScript hanno un oggetto incorporato chiamato oggetto argomenti che supporta questa abilità. – Gary

+0

Errore mio, ho avuto un errore di battitura nel mio esempio. Dovrebbe aver detto 'foo.arguments'. –

+1

nota che questo comportamento è andato in modalità rigorosa, e il tentativo di leggere ''.argomenti 'genererà un errore https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode (sotto" protezione ") – Eevee

risposta

1

Questo può essere utile se si desidera rilevare errori e calcolarli all'interno del proprio codice, in modo da poter chiarire le cose all'utente finale (o semplicemente eseguire il debug) su un output integrato, o inviare tali errori al server in modo da sapere lì è un problema sul tuo codice. Tutto questo materiale caller e arguments può aiutare a eseguire il debug dello stack. Può anche aiutare a registrare (di nuovo, eseguire il debug di roba), stampare il nome della funzione chiamante (e possibilmente i suoi argomenti). Oppure puoi fare un programma esoterico che usa queste informazioni in qualche modo in modo utile (magari all'interno di una funzione oggetto).

La ragione per cui esiste è che questo è parte del linguaggio (credo perché non è una buona domanda qui).

-1

È possibile passare la variabile arguments alla funzione chiamata:

function foo(x) { 
    return bar(x+1, arguments); 
} 

function bar(x, foo_arguments) { 
    return foo(foo_arguments[0]); 
} 

O mettere quella variabile su una variabile globale:

var args = false; 

function foo(x) { 
    args = arguments; 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(args[0]); 
} 

EDIT:

Oppure utilizzare la proprietà caller di la funzione:

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(bar.caller.arguments[0]); 
} 

Ma tutto questo non ha molto senso per me. Puoi chiarire cosa stai cercando di realizzare?

+2

Se qualcuno downvotes, almeno potrebbe lasciare un commento del perché. – emi

+0

ho downvoted perché questo non sembra avere nulla a che fare con la vera questione di come 'foo.arguments' è utile e perché esiste – Eevee

Problemi correlati