闭包应用场景有:1、采用函数引用方式的setTimeout调用;2、小范围代替全局变量;3、有权访问私有变量和私有函数的公有方法。
函数外部无法访问函数内部的局部变量,但函数内部的函数可以访问本函数内的局部变量,故通过闭包实现函数外部访问函数内部局部变量。但容易造成内存泄漏,应当谨慎使用。
闭包的使用场景
【1】、采用函数引用方式的setTimeout调用
【2】、小范围代替全局变量
【3】、访问私有变量的特权方法? 特权方法指的是有权访问私有变量和私有函数的公有方法, 私有变量包括:
(1)、局部变量
(2)、函数的参数
(3)、函数内部定义的其他函数(闭包)
一、什么是闭包
闭包说的通俗一点就是可以在函数外部访问到函数内部的变量。因为正常
情况下函数外部是访问不到函数内部作用域变量的,作用域分为了全局.函数
级.块级作用域.
let obj = {
name:'哈哈哈',
fn:function(){
return this.name
}
}
obj.fn();
// 释放obj的内存
obj = null;
表象判断是不是闭包:函数嵌套函数,内部函数被return内部函数调用外层函数的局部变量
function foo(){
var local = 1;
function bar(){
local++;
return local;
}
return bar;
}
var func = foo()
func()
把下面三行代码放在一个立即执行函数中
var item = '变量'
function foo(){ // foo ---函数
console.log(item);
// 在函数内部可访问的item变量
}
三行代码中,有一个局部变量item,有一个函数foo,foo里面可以访问到item变量。
这就是一个闭包:「函数」和「函数内部能访问到的变量」的总和,就是一个闭包!!!
二、闭包的作用
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。
三、使用闭包的注意点
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
优缺点
优点:可以隔离作用域,不造成全局污染,可以让垃圾回收机制不会回收这个变量,让他能一直被标记为被引用。
缺点:由于闭包长期驻留内存,则会导致大量内存永远不会被释放。
如何释放内存:将暴露外部的闭包变量置为 null。