Aquí hay un código que realmente tengo problemas para entender (JavaScript)
function func(x) { var y = x + 2; z = 20; return function(y) { var z = y * 3; return function(z) { return x + y + z; }; }; } console.log(func(3)(4)("z"));salida: 7z
Tengo mucha experiencia con Java (solo Java) y realmente tengo problemas para entender cómo funciona JavaScript. Intenté depurar e ir paso a paso sobre el código, pero todavía estoy muy confundido.
Una subpregunta que tengo es si y en la línea 2 es la misma y que en la línea de return function(y) .
¡Cualquier ayuda sería muy apreciada!
Al buscar el valor de la variable, JS lo seleccionará desde el alcance más cercano hacia arriba.
En la línea 5, la y es la y del argumento y no del ámbito superior. Ese valor, aunque está encerrado (léase cierres), no se usa aquí.
Lo mismo, va para la z a continuación.
Al ejecutar la sentencia, return x + y + z; el alcance externo (que está sombreando la variable y ) se destruye. Entonces, los otros valores de cierre se usan ergo 3 y 4.
function func(x) { var y = x + 2; z = 20; return function(y) { var z = y * 3; return function(z) { return x + y + z; }; }; } console.log(func(3)(4)("z"));"use strict" ! ¿Qué es el modo estricto?Así es como se vería su código.
"use strict"; function func(arg0) { var var1 = arg0 + 2; // undeclared/global variable z = 20; return function (arg2) { var var2 = arg2 * 3; return function (arg4) { return arg0 + arg2 + arg4; }; }; } console.log(func(3)(4)("z"));Creo que esto deja más claro qué variable/parámetro es qué.
Y si ejecuta esto, obtendrá un error con respecto al uso de la variable no declarada z , porque el modo estricto no permite esto, mientras que el modo descuidado crearía/usaría una variable global.
Nota al margen: eche un vistazo a Typescript . Viniendo de un lenguaje tan estricto como Java, es posible que prefiera la capacidad de escribir su código.
Lo que entiendo es de esta llamada de función es
fun(3)(4)("Z");primera llamada
x = 3; y = 5; z = 20;segunda llamada
y=4; z=60; x=3;tercera llamada
x=3; // from first function parameter y=4; // y value from second function parameter z="z" // third function parameterEn el volverá
3+4+"Z" = 7z
como cuerda
Todos los valores precalculados son inútiles