闭包作为JS中的一大难点,相信许多小伙伴也常常为此疑惑,闭包到底是什么?它有什么用呢?这是面试必问的东西
说闭包之前必须要清楚的知道 javascript 中的 变量和作用域的概念,这里就不详细讲作用域了。
var a=20;
function fn(){
var sum=0;
alert(a);//20 局部访问全局
}
fn()//先执行
alert(sum)//报错 全局访问局部
上面这个例子我们可以看到作用域的特点:局部可以访问全局的变量,但全局不能访问局部的变量
JS中的闭包设计,是一种设计思想,其主要目的是保证一个函数内部的变量既可以得到重用,又不被污染(不会被随意篡改)。
概念:闭包就是能够读取其他函数内部变量的函数。写在另一个函数内部的函数 。
function global(){
var num = 10;
function local(){
alert(num);
}
return local;
}
var demo = global();
demo() // 10 闭包;
这就是一个经典的闭包案例,我们在 global 函数内部定义其子函数 local ,并将其作为 global 的返回值,因为 local 函数作用域可以访问 global 的作用域,所以实现了从全局作用域访问 global 函数作用域的效果。
闭包打破了作用域链的规则,可以访问函数内部的变量或者方法
利用js中的垃圾回收机制,在回收被销毁的变量和函数时,如果发现被销毁的变量的函数正在被另一个函数使用,那么使用中的变量和函数将不被释放,长期驻留在内存中,直到整个程序退出时才被释放。
什么是垃圾回收机制呢?
垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存,但这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定时间间隔周期性的执行
当函数内部的变量或者方法在全局被引用的时候,当前函数就不会被垃圾回收机制所回收
function global(num){
return function(){
alert(++num)
}
}
var demo = global(1);
demo() //2
demo() //3
demo() //4
这里可以看到,闭包的使用,函数调用之后,让其外层函数的内部变量( global 函数内的变量)始终保存在了内存中,而不会被回收。使得每次调用 global 会让 num 加 1
这里要注意的是,每次调用一次 global,都会生成一个新的闭包,都会在内存中保存下其外层函数的内部变量。因此要注意闭包的使用,否则会导致性能问题。
闭包打破了作用域链的规则,可以访问函数内部的变量或者方法
当函数内部的变量或者方法在全局被引用的时候,当前函数就不会被垃圾回收机制所回收
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!