前言:市面上对闭包的理解:(不同的人对闭包的理解不尽相同)
????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:107 ??????????};8 ??????????xxx.fn(); //执行方法
封闭空间缺点:
????外面想用函数内的运算结果,是不能直接访问到的。
????解决:
????return 出去,外面接受一个返回值
????或挂window下
1 ??var obj = (function(){2 ????????window.a = 13 ????????...4 ????????return {5 ????????a,b,c6 ?????}7 ?????})();
扩充知识点:
????变量、属性 ?的区别:
????变量前面没主(默认主为window)
????属性前面有主(主就是.前面的对象)
????函数、方法 ??的区别:
????函数前面没主(默认主为window)
????方法前面有主(主就是.前面的对象)
1 let a = {} ?//a变量2 window.name= " " ?//属性3 4 function fn(){...} //函数5 string.substring();//方法6 arr.push() //点儿 . 前面的就是主
js中的闭包
原文地址:https://www.cnblogs.com/MrZhujl/p/9865365.html