what tipos que programacion closure are javascript closures side-effects

tipos - ¿Javascript cierres y efectos secundarios en inglés simple?(por separado)



tipos de scope javascript (5)

Efecto secundario:

Piense en un efecto secundario como algo que hace dos cosas a la vez. Por ejemplo:

Ejemplo clásico de un efecto secundario:

var i = 1; var j = i++;

El efecto secundario ocurre en i++ . Lo que sucede aquí es que j convierte en 1 y luego se incrementa y se convierte en 2. En otras palabras, sucedieron dos cosas y el efecto secundario fue que i convertí en 2.

Cierre:

Visualice una cadena de enlaces como este: <> <> <> <> <> <> <>. Imagine que el nombre de esta cadena de enlaces se llama la cadena de alcance . Luego imagine que todos estos enlaces conectan objetos entre sí de esta manera: <> objeto <> objeto <> objeto <>. Ahora, tenga en cuenta lo siguiente:

(1) Todas las cadenas de alcance comienzan con el objeto global .

(2) Cuando se define una función, se almacena una cadena de alcance para esa función .

(3) Cuando se invoca una función, crea un nuevo objeto y lo agrega a la cadena de alcance.

Ahora, por favor mira el siguiente ejemplo:

function counter () { // define counter var count = 0; return function () { return count + 1;}; // define anonymous function }; var count = counter(); // invoke counter

En este ejemplo, cuando se define counter() , la cadena de alcance para counter se ve así: <> objeto global <>. Luego, cuando se invoca counter() , la cadena de alcance se ve así: <> global object <> counter object <>. Después de eso, la función sin nombre (llamada función anónima) dentro del contador se define e invoca. La cadena de alcance para la función anónima una vez invocada se ve así: <> objeto global <> objeto de contador <> objeto de función anónima <>

Aquí es donde entra la parte de cierre. Si se da cuenta, la función anónima está utilizando el count variables que se definió fuera de él. La razón es porque la función anónima puede acceder a cualquier variable definida en su cadena de alcance . Esto es lo que es un cierre, una función junto con referencias a cualquier variable en su cadena de alcance almacenado.

Sin embargo, en el ejemplo anterior, una vez que las funciones regresan, los objetos creados en la invocación se descartan, por lo que realmente no hay ningún punto. Ahora mira lo siguiente:

function counter () { // define counter var count = 0; function f() { return count + 1;}; // define f return f; // return f }; var count = counter(); // invoke counter

En este ejemplo, estoy devolviendo una función llamada f y la asigno al count variables. Ahora el count la variable contiene una referencia a toda la cadena de alcance y no se descarta. En otras palabras, el conteo de variables almacena la cadena de alcance de la siguiente manera: <> objeto global <> objeto de contador <> objeto de función anónimo <>. Este es el poder de los cierres, puede mantener una referencia a una cadena de alcance y llamarla así: count() .

He estado leyendo algunos libros de JavaScript y siempre escucho sobre cierres y efectos secundarios. Por alguna razón no puedo entender lo que realmente son. ¿Alguien me puede explicar qué son en inglés simple y ejemplos? (como lo explicabas a alguien con el nivel de programación de un diseñador gráfico).


Las funciones con efectos secundarios hacen algo más que devolver un valor (aunque también pueden hacerlo). Si puede reemplazar todas las llamadas de función para argumentos dados con el valor de esos argumentos y el programa tiene el mismo comportamiento, no hay efectos secundarios. Esto requiere que la función siempre devuelva el mismo valor para los argumentos dados.

Es decir, supongamos que f(1,2) == 12 . Si siempre puedes reemplazar f(1,2) con 12 y el programa se comporta de la misma manera, entonces f no tiene efectos secundarios para esos argumentos. Por otro lado, si en un lugar f(1,2) == 12 y otro f(1,2) == 13 , entonces f tiene efectos secundarios. De manera similar, si el programa dejó de enviar un correo electrónico después de reemplazar f(1,2) con 12, entonces f tiene efectos secundarios. Generalmente, si f(x,y) == z (donde z depende de x e y) y siempre puede reemplazar cada llamada f(x,y) con z , entonces f no tiene efectos secundarios.

Algunas funciones simples con efectos secundarios:

// doesn''t always return the same value function counter() { // globals are bad return ++x; } // omitting calls to `say` change logging behavior function say(x) { console.log(x); return x; }


Soy nuevo en JavaScript y no intentaré hablar de cierres. Sin embargo, mi novedad en JavaScript me hace muy consciente del uso de efectos secundarios que son imposibles en mi lenguaje de programación habitual (Erlang).

Los efectos secundarios parecen ser una forma habitual de cambiar el estado en JavaScript. Tomemos, por ejemplo, este ejemplo del sitio web w3cschools.com:

<script> function myFunction() { document.getElementById("demo").innerHTML = "Paragraph changed."; } </script>

Aquí no hay parámetros de entrada ni valor de retorno, en cambio, los contenidos del documento se modifican, ya que tienen un alcance global para la función. Si tuviera que escribir esto en Erlang, por ejemplo, el documento se pasaría como un parámetro y se devolvería el nuevo estado del documento. Una persona que lea el programa de llamada verá un documento que se pasa y se devuelve un documento modificado.

Al ver las funciones llamadas que no devuelven un nuevo estado explícito, se debe alertar al programador sobre el uso probable de efectos secundarios.


Ejemplo

function outer() { var outerVar; var func = function() { var innerVar ... x = innerVar + outerVar } return func }

Cuando es externo () muere, la función func () continúa viva y este uso es práctico


Los efectos secundarios son el concepto más fácil. Una "función pura" es una función que asigna su (s) valor (es) de entrada a una function plus(x, y) { return x + y; } valor de salida function plus(x, y) { return x + y; } function plus(x, y) { return x + y; } . Un "efecto secundario" es cualquier efecto que no sea ese valor de retorno. Entonces, por ejemplo:

function plusWithSideEffects(x, y) { alert("This is a side effect"); return x + y; }

tiene el efecto secundario de generar un cuadro de diálogo de alerta (y requerir la interacción del usuario). Cada función de código tiene algunos efectos secundarios (todos consumen memoria y toman tiempo, si no más), pero cuando las personas hablan de efectos secundarios, a menudo se preocupan más por IO (como el cuadro de diálogo de alerta anterior) o la escritura del estado que Vive más allá del período de ejecución de la función.

El desafío con los efectos secundarios es que hacen que las funciones sean más difíciles de razonar y reutilizar. (Es mucho más fácil razonar y reutilizar las funciones que están tan cerca de las "funciones puras" como sea posible, ya que tienden a "hacer una cosa bien").