闭包

108 阅读2分钟

帮助理解

// for(var i = 0;i <10; i++){
    //console.log(i);
// }
// console.log(i)//for循环执行完10

例子

// function test() {
//     var arr = [];
//     for(var i = 0;i < 10; i++) {
//         arr[i] = function (){//把函数引用赋给数组的当前位arr[i]=函数,数组当前位需要马上执行出来,和函数体里面的内容无关,
// 函数体不是马上执行,等到 myArr[j]();的时候才会执行,i已经变成10了,共用一个执行期上下文
//             
                 document.write(i +" ");
//         }
//     }
//     return arr;
// }
// var myArr = test();//myArr就是arr
// for(var j = 0;j <10; j++) {
//     myArr[j]();
// }

例子1

// function test() {
//     var arr = [];//定义一个空数组,[]有10个函数
//     for(var i = 0;i < 10; i++) {//----------------------for循环往数组里面添数据,每一个数据就是一个function
//         arr[i] = function (){//----访问同一个i-----------把函数放arr[i]里面去,即arr[i]=函数 ,但是只能定义成函数引用,不读函数里面写的啥,
//         //  -----------------------------------------for循环结束以后i就变成10了,10个函数共用1个test执行期上下文1个闭包),执行位置不在定义位置
//             document.write(i +" ");//---------------------
//         }
//     }
//     return arr;//-------把arr返回外面,i=10的时候结束循环
// }
// var myArr = test();
// for(var j = 0;j <10; j++) {//10个函数
//     myArr[j]();//在这执行10个10------在这才执行document.write(i +" ");
// }

例子2 打印0123456789,立即执行函数

// function test() {
//     var arr = [];
//     for(var i = 0;i < 10; i++) {

//         (function (j){//形参

//             arr[j] = function() {// arr[]i执行语句,=后面的是定义语句
//                 document.write(j + "");//function() {document.write(j + "");}一坨仍然是不执行的
//             }
//         }(i))//立即执行,传参i=0,i=1......i=9
//     }
//     return arr;
// }
// var myArr = test();
// for(var j = 0;j <10; j++) {
//     myArr[j]();
// }

函数互相嵌套,把里面的函数保存到了全局,生成闭包,里面的函数在外面执行的时候,会调用得了原来函数里面的变量

例1

// function test() {
//     var temp = 100;
//     function a() {
//         console.log(temp);
//     }
//     return a;
// }
// var demo = test();
// demo();

例1变形

// var demo;
// function test() {
//     var abc = 100;
//     function a() {
//         console.log(abc);
//     }
//     demo = a;
// }
// test();
// demo();