这是我参与「4月日新计划更文活动」的第30天。
今天跟大家聊一下闭包的使用问题,以及在项目中的使用。
首先,我们先来解释一下闭包的定义和使用方法。
闭包是指能够访问外部函数变量的函数,通常以函数作为返回值的方式去定义这个函数。即使,外部的函数已经返回了,内部的函数还是可以访问外部函数定义的变量和属性。
闭包的例子
首先来举一个闭包的例子。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>闭包的使用</title>
</head>
<body>
</body>
<script>
function outer() {
var a = 10;
function inner() {
return ++a;
}
return inner;
}
var innerFn = outer();
console.log(innerFn());
console.log(innerFn());
console.log(innerFn());
</script>
</html>
看一下闭包函数执行的效果。
如上图所示:
在执行了函数outer之后,将闭包函数的返回值inner返回给变量innerFn。然后执行对应的变量innerFn,就能读取到在外部函数中定义的变量a,即使此时已经执行完了outer函数,但是变量a依然存储在内存中,进行累加。
其实,闭包这个知识点,其实本质上还是作用域的一种变形使用。
作用域的使用
在js中的作用域一般是词法作用域。
即在编译阶段就已经确定了作用域的值。
而我们常常使用的作用域有:全局作用域和局部作用域。
全局作用域在生命周期上一直存在,除非主动去销毁这个变量,不然这个变量将一直存储在内存中。
而函数作用域是在离开函数之后就会立刻从内存中销毁的,因而整个生命周期就会在离开函数之后结束。
但是闭包是这两种作用域中的特例。
他虽然是定义在函数内,但是在离开函数之后,定义在函数内的变量依然存储在内存中,没有被销毁。就是他的生命后期跟定义在全局作用域中的变量是一样的。
但是他的定义方式又是在函数内。
所以可以看作是特殊的作用域。
以上就是今天对于闭包知识点的讲解,以及闭包在工作中的使用解析。
看到掘金上的好文章,如果对你有帮助,顺手点个赞,或者把文章收藏。不用担心找不到了,以后也能经常收到类似好回答,我会持续进行更新。