JS——闭包

一.什么是闭包?

把局部变量闭包成当前作用域的私有变量的函数。(能够读取其他函数内部变量的函数)

二.特点

优点:
把局部变量拿到作用域的外部使用,让外部访问函数内部变量成为可能。
缺点:
闭包的变量会存到内存里面 , 大量使用闭包会导致内存泄漏(有一块内存空间被长期占用,而不被释放)

三.例题

例子1

	function Method(){
        var name="蒋丞";      //闭包变量
        return function(){    //闭包函数
            return name;
        }
    }
    var fun=Method()();
    console.log(fun);        //蒋丞

例子2

	function Method(){
        var num=1;
        return function(){
            num+=3;
            console.log(num);
        }
    }
    var fun=Method();
    fun();     //4
    fun();     //7
    fun();     //10

例子3

	function aaa(){
	        var name="xxx";
	        return function bbb(){
	            alert(name);
	        }
	    }
	var fun2=aaa()();      //弹出xxx

例子4 (闭包面试题)

非闭包:

	var arr=[];
    for(var i=0;i<10;i++){
        function list(){
            console.log(i);
        }
        arr.push(list);
    }
    //console.log(arr);
    arr[0](); 	//10
    arr[3]();   //10

在这里插入图片描述
因为js执行为单线程,先将for循环执行完毕后才开始执行
(1)改为闭包,输出0~9

	var arr=[];
    for(var i=0;i<10;i++){
    //将下面的 函数  改闭包函数
        var list=(function(n){
            var num=n;
            return function(){                //返回一个函数
                console.log(num);
            }
        })(i);
        arr.push(list);
    }
    console.log(arr);
    arr[0]();     //0
    arr[0]();     //0
    arr[1]();     //1
    arr[2]();     //2
    arr[3]();     //3

在这里插入图片描述

(2)改为闭包,输出1~10

    var arr=[];
    for(var i=0;i<10;i++){
    //将下面的 函数  改闭包函数
        var list=(function(n){
            var num=n;
            return function(){                //返回一个函数
                num++;    //取消则输出0~9
                console.log(num);
            }
        })(i);
        arr.push(list);
    }
    console.log(arr);
    arr[0]();     //1
    arr[0]();     //2
    arr[0]();     //3
    arr[0]();     //4
    arr[1]();     //2
    arr[2]();     //3
    arr[3]();     //4

在这里插入图片描述
例子5

    function my(){
        var n=999;
        return function my1(){
            n++;
            console.log(n);
        }
    }
    /*my()();    //1000
    my()();    //1000
    my()();    //1000*/
    var fun3=my();
    fun3();    //1000
    fun3();    //1001
    fun3();    //1002

例子7
对象里面的属性和方法使用 对象.属性或者方法
this指针:常规的函数this指针指向的全是window, 对象里面的函数this指向是当前对象

    var name="The Window";
    var object={
        name: "My Object",
        getNameFunc:function(){
            return function(){
                return this.name;   //this   window(The Window)
            }
        }
    }
    console.log(object.getNameFunc()());    //The Window

例子8 (一个完全的闭包)

    var name1= "The Windows";
    var object1={
        name1: "My Object",
        getNameFunc:function(){
            var name1=this.name1;
            return function(){
                return name1;     //My Object
            }
        }
    }
    console.log(object1.getNameFunc()());

例子9 (一次性计时器 延迟1000ms 执行前面的回调函数)

setTimeout(执行代码,延时时间)

	/*setTimeout(function (){
     console.log("执行代码");
     },1000);*/   //一次性 延时多少ms执行
     
    for(var i=0;i<10;i++){
        /*setTimeout(function (){
            console.log(i);
        },0);*/                  //输出10个10  因为js属于单线程 (遇到for循环,计时器要先排成一个队列一个一个执行,开始走的时候for循环已经执行完毕,i为最大值)

在这里插入图片描述

    for(var i=0;i<10;i++){
        (function (n){
            //n 就是闭包变量
            setTimeout(function () {
                console.log(n);      
            })
        })(i)
   }       //输出0~9

在这里插入图片描述

四、应用场景

添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值