Js闭包:含义,原理,优缺点,使用场景
闭包(closure)是Javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
要理解闭包,需要先了解[ 变量作用域 ] :全局变量和局部变量
一:含义
在本质上,闭包是将函数内部和函数外部连接起来的桥梁
function f1(){
var n=999;
function f2(){
alert(n);
// n = 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。
但是反过来就不行,f2内部的局部变量,对f1就是不可见的,fn2就是闭包。
二:原理
闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。
多个函数可以使用同一个环境,这使得他们可以通过改变那个环境相互交流。
三:优缺点
优点:
(1)逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
(2)方便调用上下文的局部变量。
(3)加强封装性,是第2点的延伸,可以达到对变量的保护作用。
缺点:
(1)内存消耗很大,会造成网页的性能问题,在IE中可能导致内存泄露,在退出函数之前,将不使用的局部变量全部删除
(2)闭包会在父函数外部,改变父函数内部变量的值,不要随便改变父函数内部变量的值。
四:场景
(1)采用函数引用方式的setTimeout调用
原生的setTimeout有一个缺陷,你传递的第一个函数不能带参数,即 “ setTimeout(func(parma),1000) ”;
这样的语句是不生效的(不过在不同浏览器中有不同的错误,总之都无法达到预期效果)
这时,我们就可以用闭包来实现这个效果了,如下:
function func(param) {
return function() {
alert(param);
}
}
var f = func(1)
setTimeout(f, 1000);
(2)将函数关联到对象的实例方法。
(3)封装相关的功能集。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。