js中的闭包
Posted 从开始到放弃,一起学JavaScript
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() //点儿 . 前面的就是主
以上是关于js中的闭包的主要内容,如果未能解决你的问题,请参考以下文章