其他分享
首页 > 其他分享> > 2-29-闭包

2-29-闭包

作者:互联网

day29

闭包

闭包是什么

闭包解决的问题/作用/使用场景(优点)

闭包的缺点

闭包的代码ji适用情况

直观的标准代码
    //普通代码
    var a = 5;
    function fn() {
        a++;w
        return a;
    }
    console.log(fn())//6
    console.log(fn())//7
    console.log(fn())//8
    console.log(fn())//9
    //闭包代码
    let add = (function() {
        var a = 5;
        return function() {
            a++;
            return a;
        }
    })()

    console.log(add())//6
    console.log(add())//7
    console.log(add())//8
    console.log(add())//9
闭包的基本代码
 function fn1() {
        var n = 100;
        // 下面这句话是定义函数,而不是调用
        let fn2 = function() {
            console.log("fn2", n);
        }
        return fn2; //把fn2返回出去。
    }
    //1
    // let f = fn1();
    //f(); //-----  fn2 100
    //2
    fn1()();

    //1=2
闭包中修改局部变量-1
 function fn1(){
        var n = 100;  //在内存中申请空间,名字n,值是100;
        // 下面这段代码是定义函数,不是调用
        let fn2 = function(){ //在内存中申请空间,名字fn2,值是函数        
            n++;
            console.log("fn2",n);
        }
        return fn2;
    }

    let f = fn1();

    f();//101
    f();//102
    f();//103
闭包中修改局部变量-2
  function fn1(){
        var n = 100;  //在内存中申请空间,名字n,值是100;
        // 下面这段代码是定义函数,不是调用
        let fn2 = function(){ //在内存中申请空间,名字fn2,值是函数            
            n++;
            console.log("fn2",n);
        }
        return fn2;
    }    

    fn1()(); //101
    fn1()(); //101
两个子函数
 function fn1(){
    var n = 100;  //在内存中申请空间,名字n,值是100;
    // 下面这段代码是定义函数,不是调用
    let fn2 = function(){ //在内存中申请空间,名字fn2,值是函数            
        n++;
        console.log("fn2",n);
    }
    
    let fn3 = function(){ //在内存中申请空间,名字fn2,值是函数            
        n++;
        console.log("fn2",n);
    }
    
    return [fn2,fn3];
}    

    let arr = fn1();
    arr[0]();//fn2
    arr[1]();//fn3
闭包示例-01
 function test1(){
	var arr = [];

	for(var i=0; i<5; i++){ 
        //赋值;(定义函数)
		arr[i] = function(){
            return i; 
        }
	}

    console.log("i",i);

	return arr;
}

    var arr = test1();
    // console.log(arr[0]);

    console.log(arr[0]());
    console.log(arr[1]());
    console.log(arr[2]());
闭包示例-02
 function test1(){
	var arr = [];

	for(var i=0; i<5; i++){ 
        //赋值;(定义函数)
		arr[i] = function(){
            return i; 
        }() //定义并调用
	}
    console.log("i",i);
	return arr;
}

    var arr = test1();

    console.log(arr);
    
    // arr[0]
用循环的方式给dom元素绑定事件
//示例:用循环的方式给html元素的事件赋值时,没法把循环变量作为函数的参数进行处理
// window.onload:当前窗口里的文档加载完毕之后,调用函数
window.onload = function(){
    let inputs = document.getElementsByTagName("input"); //inputs 是nodeList类型(dom节点的集合)

    for(var i=0;i<inputs.length;i++){
        // inputs[i].index = i;//给dom元素增加一个自定义属性
        inputs[i].setAttribute("index",i);
        inputs[i].onclick = function(){
            // console.log(i);//4
            console.log(this.getAttribute("index"));
        }
    }
}
九九乘法表
function outerFunc(){
   for(var i=1;i<=9;i++){

        (function(maxCount){
            for(var j=1;j<=maxCount;j++){			
                document.write(j+"*"+maxCount+"="+maxCount*j+"&nbsp;&nbsp;")
            }
        })(i);

        document.write("<br>");

    }
}

outerFunc();
用闭包的方式实现 mult(5)(6)(7),表示三个数的乘法(567)
 // 用闭包的方式实现 mult(5)(6)(7),表示三个数的乘法(5*6*7)  

// // 一、 mult(5)(6)  《==》 5*6

// function mult(m){

//     return function(n){
//         return m*n
//     }

// }

// 二、

// 用闭包的方式实现 mult(5)(6)(7),表示三个数的乘法(5*6*7)  

function mult(m) {
    return function(n) {
        return function(k) {
            return m * n * k
        }
    }
}

console.log(mult(5)(6)(7));
对某些数据的修改,只想限定在某个函数里,而不是任何地方都可以修改
// 对某些数据的修改,只想限定在某个函数里,而不是任何地方都可以修改
    function fn1(){
        let count = 10;
        function add(){
            count++;
        }
        return add;
    }

    let f = fn1();

    f();
    f();

标签:闭包,function,console,log,29,fn2,函数
来源: https://blog.csdn.net/HXX548888/article/details/112851331