美文网首页
闭包函数

闭包函数

作者: 你怀中的猫 | 来源:发表于2022-05-19 11:10 被阅读0次

1、闭包: 在外部函数内,定义一个内部函数,这个内部函数,会对外部函数中声明的变量进行操作,并在外部函数的外面,去调用这个内部函数,所形成的闭合回路 叫 闭包

当一个函数的返回值是一个函数
function fn(){
    return function (){ alert("拉拉") };
}
var res = fn();  //res = function (){ alert("拉拉") }
console.log(res);
function fn(){
    var count = 10; //父函数的局部变量 count
    function fnSon(){   //子函数
        count++;       //操作子函数局部变量
        alert(count);
    }
    fnSon();
    return fnSon
}
var res = fn();   //res = fnSon
res();  // 调用 11
res();  // 调用 12

2、闭包优点:

2-1 :快速分割变量空间,防止变量名污染
2-2 : 能够缓存局部变量数据,保证代码正常执行

3、闭包缺点:

3-1 : 闭包形成后,会导致父函数的内存空间暂存,即使父函数调用完也不会 被销毁滥用、多用闭包会导致,内存空间被消耗,引起应用卡顿,严重的可导致 内存溢出

4、常见的闭包形式

主动编写的闭包
var fnn = null;
function fn(){
    var count = 100;
    fnn = function(){
        count++;
        alert(count);
    }
}
fn();
fnn();   //调用形成闭包  count = 101
fnn();   //调用形成闭包  count = 102
返回值:
function main(){
    var count = 100;
    return function(){
        count++;
        alert(count);
    }
}
var re = main();
re();    //101
re();    //102

5、ES6JS :语句对象特性,当对象的值,只是一个变量表示,与key一致,那么可以省略值

var A = (function(){
    var a = 100;
    var b = 200;
    function fn1(){
        a++;
        alert(a);
    }
    
    function getA(){
        return a;
    }
    return {
        fn1,
        getA,
        a,
        b
    }
})()
console.log(A)
A,fn1();   //101
A,fn1();   //102
alert(A.a);    //100
alert(A,getA());   //102

6、封装工具方法库

var Utils = (function(){
    
    //1、封装随机数
    function randNum(min,max){
        return Math.floor(Math.random() * (max-min+1)+min);
    }
    
    //2、随机颜色
    function randColor(){
        var r = randNum(0.255);
        var g = randNum(0.255);
        var b = randNum(0.255);
        return `rgb(${r},${g},${b})`;
    }
    
    
    //3、基本运算
    function operate(num1,num2,callback){
        if(isNaN(num1 + num2)){
            alert("请输入正确的数字")
            return 0;
        }
        return callback(+num1 , +num2);
    }
    
    //4、秒转时间格式01:22:02
    function timeFormat(time){
        //获取时
        var hour = Math.floor(time / 3600);
        //获取分
        var min = Math.floor(time % 3600 /60);
        //获取秒
        var sec = Math.floor(time % 3600 % 60);
        //如果不足两位 < 10, 在前面补0
        hour = hour < 10 ? '0' + hour : hour;
        min  = min  < 10 ? '0' + min  : min ;
        sec  = sec  < 10 ? '0' + sec  : sec ;
        
        return `${hour} : ${min} : ${sec}`
    }
    
    
    //导出封装的工具方法
    return {
        randNum,randColor,
        operate,timeFormat
    }
          
})()
应用封装库

    //获取随机数
    var rand = Utils.randNum(2,10);
    alert(rand);

    // 获取随机颜色

    var color = Utils.randColor();
    alert(color);

    // 转换
    alert(Utils.timeFormat( 5000 ));

7、事件绑定的典型闭包形式

<button id='btn'>按钮</div>

function main(){
    var count = 100;
    var btn = doucument.getElementById('id');
    
    btn.onclick = function(){
        count++;
        alert(count)   //按按钮可连续增加
    }
}
main();

8、延时器的闭包形式

start();   //调用
function start(){
    var count = 100;
    setInterval(function(){
        console.log(++count);
    },1000)
}             //每隔一秒count增加1

9、 函数形参默认值:是指函数调用时,不传、或者少传参 时,函数的形参一般形况下会接收一个undefined,为实现不传参数时,形参拥有一个默认值,可以利用逻辑或表达式实现默 认值设置。

function fn(argu1,argu2){
    argu1 = argu2 || 默认值
}

10、可变参数数组:关键字 arguments

 function sum(){
        var res = 0;
        for(var i = 0 ; i < arguments.length; i++){
            res += arguments[i];
        }
        console.log(arguments)
        return res;
    }
    alert(sum(1,2,3,4)) ;

    alert(Math.max(1,3,6,34,67,99))

通过遍历arguments 可以实现动态参数函数的定义

11、函数的递归调用:是指在函数内部调用自身

var count = 0;
function fn(){
    count++;
    if(count > 10) return;
    fn();
}
fn();
console.log(count);   // 11

相关文章

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • 关于逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包当函数执行过程中,执行的函数内部的闭包,...

  • 3.逃逸闭包,非逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包:当函数执行过程中,执行的函数内部的闭包...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • day14-函数(3)装饰器

    一、闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间与作用域 闭包函数 1、闭:指的是该函数是定义在一个函数内...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • JS的闭包

    1.闭包的概念 闭包函数:声明在一个函数中的函数,叫做闭包函数。闭包:内部函数总是可以访问其所在的外部函数中声明的...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 2018-07-10swift4与swift 3.3 语法重拾(

    函数与闭包 闭包

  • 闭包和立即执行函数

    闭包闭包:内部的函数引用了外部的函数的变量,则产生闭包。闭包的作用:把变量封装在函数中,只有内部函数可以用,让函数...

网友评论

      本文标题:闭包函数

      本文链接:https://www.haomeiwen.com/subject/ulfzurtx.html