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.
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
Errore mio, ho avuto un errore di battitura nel mio esempio. Dovrebbe aver detto 'foo.arguments'. –
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