1、什么是闭包?
- 闭包的概念
闭包就是函数嵌套,让局部变量变成自由变量的环境,是一种让局部变量进化的方式,定义在一个函数内部的函数。
垃圾回收机制:用过一次的东西,先放在一个内存中,不立即删掉,可以随时进行还原或再次使用,直到没有任何作用的时候再清除
2、闭包的应用场景
- for循环之中:
for循环之中的i变量会因为for的循环次数被覆盖,所以在for循环内部存在函数时,而且这个函数内会调用i变量,这种情况下就需要用到闭包。
for (var i = 0; i < 10; i++) {
console.log(i); //可以访问到每次的i
}
- 必须满足两个条件:
1.在for循环内存在函数
2.函数内会调用这个变量
var ali = document.getElementsByTagName("li");
for(var i=0;i<10;i++){
// console.log(ali[i])
ali[i].onclick = function (){
console.log(i); //在函数内部就无法访问到外部变量
}
}
var ali = document.getElementsByTagName("li");
for(var i=0;i<10;i++){
// console.log(ali[i])
ali[i].onclick = () => {
console.log(i); //在函数内部就无法访问到外部变量
}
}
var ali = document.getElementsByTagName("li");
for(var i=0;i<10;i++){
(function(a){
ali[a].onclick = function(){
console.log(a);
}
})(i)
}
一旦内部函数调用外部函数的局部变量,那么这个时候,这个局部变量就会变成内部函数的私有变量
2.当需要给setTimeout的回调函数传参时:
setTimeout(function (a){
console.log(a); //两秒后,undefined
}, 2000);
// 或
setTimeout(fn(10), 2000);
function fn(a){
console.log(a); //没有延迟,直接打印10
}
- 使用闭包:
function fn(a){
return function(){
console.log(a); //两秒后,10
}
}
var f = fn(10);
setTimeout(f, 1000);
- 闭包特点:
闭包是将函数内部和函数外部连接起来的桥梁
可以读取函数内部的变量
让这些变量的值,始终保存在内存中,不会在调用结束后被系统回收
避免全局变量命名空间的污染
内存消耗很大,不能滥用
闭包会在父函数外部,改变父函数内部变量的值
闭包的好处
1.不会污染全局环境;
2.可以进行形参的记忆,减少形参的个数,延长形参生命周期
function add(x) {
return function (y) {
return (x + y)
}
}
var sum = add(2)
console.log(sum(5))
//add2(1)(2)(3) = 6;
function add2(a) {
return function (b) {
return function (c) {
return a + b + c
}
}
}
console.log(add2(1)(2)(3))
// add(1, 2, 3)(4) = 10
function add3(a, b, c) {
return function (d) {
return a + b + c + d
}
}
console.log(add3(1, 2, 3)(4))
// add4(1)(2)(3)(4)(5) = 15
function add4(a) {
return function (b) {
return function (c) {
return function (d) {
return function (e) {
return a + b + c + d + e
}
}
}
}
}
console.log(add4(1)(2)(3)(4)(5))
3.方便进行模块化开发
var module = (function () {
var name = "123";
function init() {
console.log(name);
}
return {
getname: init
}
})()
module.getname()