含义
闭包是指有权访问另外一个函数作用域中的变量的函数
原因
内部的函数存在外部作用域的引用就会导致闭包
作用
- 保护函数的私有变量不受外部的干扰,形成不销毁的栈内存
- 把一些函数内的值保存下来,闭包可以实现方法和属性的私有化
缺点
函数变量一直保存在内存中,过多的闭包会发生内存泄漏
(内存泄露四种方式:意外的全局变量、被遗忘的setInterval或回调函数、脱离DOM的引用、闭包)
场景
-
原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果
setTimeout(function(param){ alert(param) },1000) //通过闭包可以实现传参效果 function func(param){ return function(){ alert(param) } } var f1 = func(1); setTimeout(f1,1000); -
节流防抖
-
for循环赋值
-
柯里化函数
面试题
- for 循环和闭包
-
//这里的 i 是全局下的 i,共用一个作用域,当函数被执行的时候这时的 i=3,导致输出的结构都是3。 var data = []; for (var i = 0; i < 3; i++) { data[i] = function () { console.log(i); }; } data[0](); data[1](); data[2](); /* 输出 3 3 3 / //自执行函数和闭包var data = []; for (var i = 0; i < 3; i++) { (function(j){ setTimeout( data[j] = function () { console.log(j); }, 0) })(i) } data[0](); data[1](); data[2](); /* 输出 0 1 2 / //let 具有块级作用域,形成的3个私有作用域都是互不干扰的。 var data = []; for (let i = 0; i < 3; i++) { data[i] = function () { console.log(i); }; } data[0](); data[1](); data[2](); /* 输出 0 1 2 /