es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Evitar colisiones ocultando variables dentro del alcance de una función.

No puedo entender este fragmento de código que explica cómo se produce una colisión entre variables.

function foo() {
  function bar(a) {
    i = 3;

    console.log(a+i);
  }

  for(var i=0; i<10; i++) {
    bar(i+2);
  }

}

foo();

Este código tiende a crear un bucle infinito debido a la colisión de variables. Declarar “var i = 3” resuelve el problema, pero ¿cómo puedo utilizar el ámbito para “ocultar” la declaración interna de la variable i? Y principalmente, ¿por qué surge el problema del bucle infinito en primer lugar?

Sin embargo, cuando elimino la asignación de “i = 3”, ¿se consideraría eso como una solución al problema?

function foo() {
  function bar(a) {
    console.log(a+i);
  }

  for(var i=0; i<10; i++) {
    bar(i+2);
  }

}

foo();
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el fragmento de código es que utiliza una variable llamada “i” en dos ámbitos diferentes. La primera declaración de “i” se encuentra dentro de la función interna “bar” y no se declara con la palabra clave “var”. Esto significa que “i” se convierte en una variable global y es accesible desde las funciones internas y externas.

    En el bucle for de la función externa “foo”, se utiliza la palabra clave “var” para declarar “i” nuevamente, creando una segunda instancia de “i” dentro del ámbito de “foo”. Esto hace que la segunda instancia de “i” sobrescriba el valor de la primera instancia de “i” en el ámbito global, lo que conduce a resultados inesperados y un bucle infinito en este caso.

    Para resolver este problema y evitar variables globales, podemos declarar la variable “i” utilizando la palabra clave “var” tanto en las funciones internas como externas. Esto asegura que cada función tenga su propia instancia de “i” y que no interfieran entre sí.

    function foo() {
      function bar(a) {
        var i = 3; // declarar i usando la palabra clave var
        console.log(a+i); 
      }
    
      for(var i=0; i<10; i++) {
        bar(i+2);
      }
    }
    
    foo();
    

    Al declarar “i” en la función “bar” utilizando la palabra clave “var”, estamos creando una nueva instancia de “i” dentro del ámbito de “bar” y haciéndola local a esa función. Esto asegura que “bar” no modifique inadvertidamente la variable global “i”.

    Eliminar la asignación de “i = 3” en la función “bar” no resolvería el problema, ya que seguiría creando una variable global “i” debido a la falta de la palabra clave “var” en su declaración.

    function foo() {
      function bar(a) {
        console.log(a+i); 
      }
    
      for(var i=0; i<10; i++) {
        bar(i+2);
      }
    }
    
    foo();
    

    En este código modificado, la variable “i” se declara utilizando la palabra clave “var”, asegurando que sea local al ámbito de la función “foo”. Esto evita crear una variable global y previene colisiones con variables del mismo nombre en otros ámbitos.

Comments are closed.