这段时间在学习Javascript,在过程中记录下一些知识点,以便以后回顾和帮助一些初学的朋友,要是有大神能给提点建议就最好了。
初识闭包
闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。 —— [ 百度百科 ]
上面的这个定义来自百度百科,看完之后其实你还是不知道闭包是什么东西,那么下面来看一个实际的例子,可能更好理解。
function A(){
function B(){
console.log("Hello!");
}
return B;
}
var c = A();
c();//Hello!
这就是一个最简单的闭包,我们来分步读一下这个例子。
1,定义普通一个函数A。
2,在里面定义一个普通函数B。
3,函数A返回函数B。(在Javascript中函数也是对象,所以可以被当作返回值)
4,把函数A的执行结果赋值给变量c
5,执行c()
用一句话来归纳下,函数A的内部函数B被函数A外面的变量c引用,或者当一个内部函数被外部函数之外的变量引用了,这就是一个闭包。
闭包的作用
为了讲清楚闭包的作用,先说下为什么会形成闭包,之所以会形成闭包是因为Javascript中GC的机制是回收没有被引用的对象,而在上面的例子中,函数B属于函数A,函数B被变量c引用,就是说c间接的引用了函数A,所以A不会被回收,会一直存在于内存之中。下面我们通过改进一下上述例子来证实一下这个结论。
function A(){
var count = 0;
function B(){
count ++;
console.log(count);
}
return B;
}
var c = A();
c();// 1
c();// 2
c();// 3
每执行一次c(),输出的结果就会加1,说明变量count的值的生命周期被延长了,没有随着函数的执行完毕而消失,count是函数A的局部变量,那说明函数A一直是存在的,他没有消失。
这就是闭包的作用,它延长变量的生命周期,而且不会“污染”全局变量,所以在一些类似的计算或者缓存等场景都可以使用闭包来完成,但是使用闭包也需要谨慎,因为它不会释放内存,使用平凡可能会影响效率。
文章是在慕课网学习相关文章后整理而来,关于闭包的用法还有很多东西,之后学习了还会更新过来。