Explicación detallada de cierres, depuración paso a paso a través de herramientas de depuración

La formación de cierres: las referencias de la función y el estado circundante (entorno léxico) se agrupan para formar un cierre. Un
cierre puede llamar a la función interna de una función en un alcance y acceder a los miembros en el alcance de la función

La comprensión simple es ampliar el alcance de los miembros internos de la función externa . Aquí necesitamos agregar un poco de conocimiento: cuando
se ejecuta la función, se colocará en una pila de ejecución, y cuando se ejecuta la función, se ser eliminado de la pila de ejecución
pero cerrado. Cuando sucede, los miembros del alcance en el montón no se pueden liberar porque están referenciados externamente, por lo que la función aún puede acceder a los miembros de la función externa

Mira el siguiente botón, esta es una sencilla aplicación de cierres

//  函数作为返回值

function makeFn(){
    
    
    let msg = "hello Closure!"
    return function(){
    
    
        console.log(msg)
    }
}

El principio es que la función externa makeFn the internal members msg tiene el alcance para extender el

A continuación, observe la ocurrencia de cierres a través de la herramienta de desarrollo de Chrome.
Ponemos un punto de interrupción en la línea 49, prestamos atención a la pila de ejecución y el alcance a la derecha, y luego comenzamos a depurar paso a paso.

Inserte la descripción de la imagen aquí

Al comienzo de la ejecución, empuje la función makeFn a la pila de ejecución, vea que el alcance apunta a la ventana, se promueve la declaración de variable de msg y se asigna el valor indefinido
Inserte la descripción de la imagen aquí
para continuar con la ejecución: Asigne
Inserte la descripción de la imagen aquí
un valor a msg y busque un return value, que es una función que
Inserte la descripción de la imagen aquí
continúa ejecutando dos pasos. Ingresando dentro de la función devuelta, Closure es un cierre. Al mismo tiempo, el mensaje se almacena en el cierre
Inserte la descripción de la imagen aquí
para continuar con la ejecución, y el contenido de msg saldrá. se encuentra que cuando aparece Closure, es decir, cuando ocurre el cierre, msg no se publica. Por lo tanto, todavía es accesible.
Proporcione algunos ejemplos de cierres

//  once 
function once(fn){
    
    
    let done = false
    return function(){
    
    
        if(!done){
    
    
            done = true
            return fn.apply(this ,arguments)
        }
    }
}
let print = once(function (msg) {
    
     
    console.log(msg)
 })
//  print("666")
//  print("666")
//  print("666")
//  print("666")

//  延长了外部函数的内部成员的作用范围
//  计算底数的几次幂

 function makePow (exponent){
    
    
    return function(buttomNuber){
    
    
        return  Math.pow(buttomNuber,exponent)
 
    }
}

// console.log(makePow(2)(2))

// 闭包累加器
function add(){
    
    
    let sum = 0 
    return function(){
    
    
        console.log( ++ sum)
    }
}
// var myadd = add()
// myadd()
// myadd()
// myadd()
// myadd()

Material de referencia:
retractarse de la educación

Supongo que te gusta

Origin blog.csdn.net/qq_43377853/article/details/112003184
Recomendado
Clasificación