Funciones de orden superior: cierres, recursividad

Tareas asincrónicas:
1. Función de devolución de llamada
2. Temporizador
3. Función de devolución de llamada Ajax

1. Funciones de orden superior

  • Las funciones de orden superior son funciones que operan en otras funciones y reciben funciones como parámetros o parámetros de salida como valores de retorno.
  • La función también es un tipo de datos y también se puede pasar a otro parámetro como parámetro, como una función de devolución de llamada.
  function fn(callback) {
    
    
            callback && callback();
        }
        fn(function () {
    
    
            alert("hi");
        })
 function fn() {
    
    
            return function () {
    
     }
        }
        fn();

Por ejemplo: jQuery llama a la función de devolución de llamada, ejecuta los parámetros anteriores y finalmente llama a la función de devolución de llamada.

   $("div").animate({
    
     left: 200 }, function () {
    
    
            $("div").css("backgroundColor", "purple");
        })

Dos, cierre

Alcance variable:
1. Alcance local: El alcance local no se puede utilizar fuera de la función.
2. Alcance global
3. Cuando se ejecuta la función, el alcance local se destruirá.
El llamado cierre se refiere a una función que tiene acceso a una variable en el ámbito de otra función.
Rol: extender el alcance de la variable (extender el ciclo de vida).
El ejemplo más simple:

  function fn(){
    
    
        var num = 0;
        function func(){
    
    
            console.log(num);
        }
        func();
    }
    fn();   // 0    子类访问到父类的变量

Se accede a la variable num en fn, por lo que se puede decir que fn es una función de cierre. También se puede decir que los cierres son un fenómeno.

function fn() {
    
    
    var num = 0;
      return function () {
    
    
                console.log(num);
            };
}
var f = fn();
f();   //  用return返回出去,使外部能访问内部变量。
El cierre se da cuenta de bucle pequeño li
 var lis = document.querySelectorAll('li');
        for(var i = 0;i<lis.length;i++){
    
    
            //一般做法将每次循环的索引号赋值给i 比闭包简单
            lis[i].index = i;
            lis[i].onclick = function(){
    
    
                console.log(this.index);
            }
        }
        // 2.利用闭包得到当前小li的索引号
        for(var i =0;i<lis.length;i++){
    
    
            //利用for循环创建了4个立即执行函数
            //立即执行函数也称为小闭包,因为立即执行函数里所有函数都可以访问到i变量
            (function(i){
    
    
                lis[i].onclick = function(){
    
    
                    console.log(i);
                }
            })(i);
        }
Cálculo de cierre del precio del taxi
var car = (function () {
    
    
    var start = 13; //起步价
    var total = 0;  //总价
    return {
    
    
        price: function (n) {
    
    
            if (n <= 3) {
    
    
                total = start;
            } else {
    
    
                total = start + (n - 3) * 5
            } return total;
        },
        delay: function (flag) {
    
    
            return flag ? total + 10 : total;
        }
    }
})()
console.log(car.price(5)); //23
console.log(car.delay(true));  //33

console.log(car.price(3));//13
console.log(car.delay(false));//13
Pregunta de pensamiento 1
 var name = "Hello Window";
        var object = {
    
    
            name:"MyObject",
            getNameFunc:function(){
    
    
                return function(){
    
    
                    return this.name;
                }
            }
        }
        console.log(object.getNameFunc()());  //  Hello Window 
        //匿名函数this指向window window下又有个name属性 = Hello Window
        // 拆解如下:
        var f = object.getNameFunc();
              = function(){
    
    
                    return this.name;
                }
                // 不是闭包,没有局部变量使用
var name = "Hello Window";
var object = {
    
    
    name: "MyObject",
    getNameFunc: function () {
    
    
        var that = this;
        return function () {
    
    
            return that.name;
        }
    }
}
console.log(object.getNameFunc()());  // MyObject

Tres, recursividad

  • Una función puede llamarse a sí misma internamente.
  • Dado que la recursividad es propensa a errores de desbordamiento de pila, se debe agregar la condición de salida return.
  var num = 1;
        function fn() {
    
    
            console.log("我要打印6句话");
            if (num == 6) {
    
    
                return;
            }
            num++;
            fn();
        }
        fn();
secuencia Fibonacci
   // 斐波那契数列(兔子序列) 1 1 2 3 5 8 13 21  前两项后第三项的和
    function fn(n) {
    
    
        if (n === 1 || n === 2) {
    
    
            return 1;
        }else{
    
    
            return fn(n-1) + fn(n-2);
        }
    }
  console.log(fn(8));   // 21:   表示第8个数是21
Atravesar datos complejos de forma recursiva
var data = [{
    
    
    id: 1,
    name: "小米",
    goods: [{
    
    
        id: 11,
        gname: "小明"
    }, {
    
    
        id: 12,
        gname: "小兰"
    }]
}, {
    
    
    id: 2,
    name: "小新"
}];
//利用递归遍历到每一次id 根据用户输入id号匹配输出
function getId(json, id) {
    
    
    json.forEach(function (item) {
    
    
        if (item.id == id) {
    
    
            console.log(item);
        } else if (item.goods && item.goods.length > 0) {
    
    
            getId(item.goods, id);
        }
    });
}
(getId(data, 11)); // 

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_47067248/article/details/108036072
Recomendado
Clasificación