Me preguntaba si uso el método de búsqueda para devolver un objeto de promesa para manejar la operación asincrónica dentro de una función que se ve así:
<script> function test(){ let promise = fetch("https://xxx"); promise.then(()=>{console.log("completed!")}); }; test() </script>Esto funcionará, pero mi pregunta es una vez que la función test () se ejecuta por completo, de acuerdo con lo básico en Javascript donde "Las variables de función (locales) se eliminan cuando se completa la función". , mi opinión es que la variable de promesa se eliminará y el objeto de promesa real se encuentra en algún lugar de la memoria y tendría una referencia 0, por lo que javascript lo eliminaría. Pero todavía funciona
¿Es la implementación de los conjuntos de objetos Promise que funciona de manera diferente en Javascript?
¡¡Muchas gracias!!
Actualización 1 : Lo siento por mi tonto error al no declarar la variable de promesa con let o var. Aquí para agregarlo. ¡Gracias!
Lo que tienes no es una variable local. Al declarar promise sin una palabra clave, ha creado una variable global adjunta a la ventana.
Si usa la palabra clave let o const , declarará una variable de alcance de bloque, que se recolectará como basura a discreción del sistema después de su uso. (O incluso var en este caso lo ampliará a la función)
function test(){ const promise = fetch("https://xxx"); promise.then(()=>{console.log("completed!")}); }; Tenga en cuenta la const *
Las variables no se borrarán de la memoria, a menos que no haya más punteros a las variables. Hay un recolector de basura en javascript responsable de verificar las referencias y liberar la memoria siempre que sea posible (Puede leer más sobre esto aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management ). Entonces, cuando las funciones terminaron, no puede acceder a la variable directamente, pero la memoria aún permanece ya que hay un puntero a la promesa que cambiaría el estado de la promesa dependiendo del resultado de la acción (cumplida o rechazada).
Este es un código incorrecto.
Debido a que no declaró que su variable de promise sea una variable local de la función, se convertirá en una global implícita y NO se recolectará basura porque es una global.
Si lo declara localmente con let , const o var en esa función (por lo que es una variable local dentro de esa función), entonces se recolectará basura cuando se hizo la promesa y se completó la función.
Entonces, si haces esto en su lugar:
<script> function test(){ const promise = fetch("https://xxx"); promise.then(()=>{console.log("completed!")}); }; test() </script>Luego, se recolectará como basura cuando se completen la función y la promesa.
Debe declarar explícitamente TODAS las variables con let o const en el ámbito en el que desea usarlas. Si bien var todavía funciona (por razones de compatibilidad con versiones anteriores), ya no hay razones para usarlo.