发表于: 2019-03-27 21:58:13

1 598


今天完成的事情:

1写了第二个页面的 点击事件 数字输入

2看书


明天计划的事情:

继续做任务 看书


收获:

1 f() 表示是运行了函数f() 返回的是函数f()运行后的值 ,如果是f 表示的是整个函数f()表达式  并没有运行

2闭包函数 :


   function f1() {
  var n = 999;
    // return n; //return n之后的语句就不可以再访问变量n了 只有运行f1()可以访问(因为是f1返回的)
   console.log(n)
   function f2() {
      console.log(n);
     }
            return f2; //注意 return f2是指返回一个没有运行的f2函数 即return f2()= f2(){console.log(n)}
        //     //  如果return f2()是指返回一个运行了的f2() 即return f2()=999
             // 总结 f() 表示是运行了函数f() 返回的是函数f()运行后的值 ,如果是f 表示的是整个函数f()表达式  并没有运行
         }
         console.log(typeof f1)
         console.log(f1()) //注意 运行函数f1() 并不会运行函数f2()
         var result = f1(); //注意 这里f1()已经运行了  并将返回值(即上面console.log(f1())打印出来的值) 赋给了 result
        console.log(result)
         result(); // 然后运行 result() 即运行console.log(f1())打印出来的值=999,f2(){ console.log(n);}  所以结果为999(注意该999是由于运行了函数f2())
        // 为什么将return f2 关闭之后 result();会报错为 result is not a function  因为关闭之后 f1()的返回值就剩下一个999了
         console.log(typeof result)
         // 运行f1() 与 运行result() 的区别是什么?
         //   运行函数f1()的话 不可以运行函数f2();运行函数result()的话,可以运行函数f2()
         // 【为什么运行result()可以运行f2()?】 因为result=f1()函数运行之后的返回值 包括一个未运行的f2()函数


总结:
1)运行外部的函数时f1(),并不可以直接运行f2(),需要通过在f1函数内 return f2(即返回f2函数表达式) ,然后将f1()运行之后的结果返回给一个变量result;运行result()就可以运行f2()了

2)内部的函数可以访问外部函数的变量 ,反之不行
3)闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在,不会被垃圾回收机制回收。。
4)第二段代码中,start是函数createIncrementor的内部变量。通过闭包,start的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包inc使得函数createIncrementor的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。
为什么会这样呢?原因就在于inc始终在内存中,而inc的存在依赖于createIncrementor,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。
5)由第三点代码可知:闭包的另一个用处,是封装对象的私有属性和私有方法。
6)注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。



返回列表 返回列表
评论

    分享到