大家好,我是IT修真院成都分院第8期的学员濮力钒,一枚正直纯洁善良的WEB前端程序员。
今天给大家分享一下,闭包是什么?用处如何?
1.背景:
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前的词法作用域之外的执行的。
2.知识剖析:
面这个概念是引申自《你所不知道的JavaScript》中,变量a定义在函数fn()的作用域中,并且函数fn()中含有一个内部函数func(),内部函数func()持有对变量a的引用。在正常情况下,当函数func执行后就,内部的变量就会被垃圾回收机制所回收(比如变量a)。但是函数fn()返回了内部函数func(),内部函数func()会随时访问变量a,所以垃圾回收机制是不会回收函数fn()的内部作用域的,这就是闭包的含义。
实例1;function fn(){
var a = 100;
function func(){
console.log(a);
}
return func;
}
var func = fn();
func(); //100
↑在外部调用函数内部的赋值;
函数在定义的词法作用域以外的地方被调用,闭包使得函数可以继续访问定义时的词法作用域。
定义:
因为函数可以读取父元素的变量,不可以反过来,同级函数也是不可以相互读取内部变量的,但是闭包不一样,简单说就是可以读取其他函数内部的变量的函数。
只要满足这个情况的应该都是叫闭包。
闭包作用:1.可以使用同级的作用域
闭包作用:2.读取其他元素的内部变量
闭包作用:3.延长作用域
闭包有什么缺点呢?
闭包的缺点1,作用域没有那么直观
闭包的缺点2,因为变量不会被垃圾回收所以有一定的内存占用问题。
提问1:
例子中如果没有var func = fn();这个定义会发生什么/
因为这是一个引用如果去掉的话,函数并不能够形成闭包,会是一个undefined的情况。
提问2:
为什么说可以访问到其他函数的作用域
简单的说函数闭包之后就可以完成一些正常情况访问不到的作用域,比如父级访问子集,同级之间的相互访问,让函数变得更加灵活。
提问3:
怎么可以做到不浪费内存呢,
可以result=null清除没有被垃圾回收的数据哦。
作者:易闲_ab73
链接:https://www.jianshu.com/p/0e7b25339d92
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。