Para una función como esta:
function threeArgs(x, y, z) {
return x + y + z;
}
que se llama así:
threeArgs(1, 2, 3);
el optimizador es libre de tomar la decisión de generar ningún código en absoluto. Es bastante fácil para él determinar que no hay efectos secundarios, porque la función simplemente hace referencia a sus valores de parámetros y devuelve el resultado de una expresión simple. Como se ignora el valor de retorno, no hay ninguna razón para que el tiempo de ejecución haga nada.
Más allá de eso, si el código fueron:
something += threeArgs(1, 2, 3);
el optimizador puede decidir generar código más o menos equivalente a:
something += 6;
¿Por qué? Porque la llamada se realizó con constantes numéricas, y puede doblarlas en el momento de generación de código. Puede ser conservador en eso, porque los números son raros, pero aquí están todos enteros, así que bien podría hacer esto. Incluso si no lo hiciera, podría inline con seguridad la función:
something += 1 + 2 + 3;
Cuando hay un parámetro que falta, sin embargo, puede ser que el optimizadores de la fianza y generar una llamada a la función real. Para una función tan simple, la sobrecarga de la llamada de función podría explicar fácilmente una gran diferencia en el rendimiento.
Al usar variables en lugar de constantes en una prueba, y al usar realmente el valor de retorno de la función, puede "confundir" el optimizador y evitar que se salte la llamada o pre-calcule el resultado, pero puede hacerlo ' t evitar que forme parte de la línea. Todavía creo que su resultado es interesante por esa razón: expone el hecho de que (a partir de hoy de todos modos) esos optimizadores son sensibles a la forma en que se invocan las funciones.
@MattWhipple - Esa es una publicación interesante, pero ¿qué tiene que ver con la pregunta de OP? (Buena pregunta, por cierto, @robC.) –
Este es un hallazgo interesante.Antes de cambiar todo el código para completar todos los argumentos, verificaría si hay un informe de errores abierto para esas implementaciones de JS, y si no es el archivo uno. –
Sospecho fuertemente que el tiempo de ejecución está delimitando las funciones cuando hay una coincidencia de conteo de parámetros, pero de lo contrario ejecuta la función como una función real. El hecho de que nada haga uso del valor de retorno de la función puede significar que el tiempo de ejecución no * nada * cuando los parámetros están completamente suministrados. – Pointy