JS 中的 闭包

前言:市面上对闭包的理解:(不同的人对闭包的理解不尽相同)
1.一个函数就是一个闭包
2.闭包就是让内部函数可以访问外部函数的参数或者变量,这个值是不会被浏览器垃圾回收机制回收

js中的闭包理解:
js有个特性,函数开了一个新空间,里面的变量、私有属性都不会被外界干扰.(封闭空间)
(function(){ })()
闭包:
  函数套函数,子函数使用父函数的参数或者变量,并且子函数被外界所引用(没释放)
  这个时候,父函数的参数或者变量不会被垃圾回收机制回收,此时在浏览器(chrome)
  中打印父级的返回值,在scopes下多了一个closure,closure就叫闭包。
1     function fn(a) {
2         return function f(){//函数套函数
3             a++//子函数使用父函数的变量或者参数
4         }
5     }
6     abc = fn(1);
7     console.dir(abc);//scopes下多了一个closure,closure就叫闭包。

为什么要用闭包?
就是为了函数体内的参数或者变量不会被垃圾回收机制回收(保留下来)

函数体内的参数或者变量什么时候被销毁?
函数执行:(五步)
1.开了一个空间(新的作用域)
2.参数赋值
3.预解析(变量提升)
4.从上到下执行上下文
5.局部作用域销毁
当直接调用完函数,函数就自动被回收了(包括函数内的参数、变量)

闭包的作用(应用场景):
  1.私有变量不被外界所干扰(互相不冲突)
在多人开发的时候,在全局作用域下难免会遇到名字重复的情况。(全局污染)
  2.存储父函数的参数或者变量 (不被浏览器的垃圾回收机制回收)
解决:
  可以使用封闭空间
  (function(){})()
  可以使用命名空间
  把变量变成属性、把函数变成方法
1 var xxx = {//xxx是我独有的且不和别人重复的名字。
2               fn:function (){
3                   // alert(1);
4                   console.log(this);//我的对象
5               },
6               a:10
7           };
8           xxx.fn(); //执行方法

封闭空间缺点:
外面想用函数内的运算结果,是不能直接访问到的。

解决:
return 出去,外面接受一个返回值
或挂window下

1   var obj = (function(){
2         window.a = 1
3         ...
4         return {
5         a,b,c
6      }
7      })();

 

扩充知识点:
变量、属性 的区别:
变量前面没主(默认主为window)
属性前面有主(主就是.前面的对象)

函数、方法 的区别:
函数前面没主(默认主为window)
方法前面有主(主就是.前面的对象)
1 let a = {}  //a变量
2 window.name= " "  //属性
3 
4 function fn(){...} //函数
5 string.substring();//方法
6 arr.push() //点儿 . 前面的就是主

 

posted @ 2018-10-28 13:53  真的想不出来  阅读(243)  评论(0编辑  收藏  举报