1·闭包的概念
闭包 (closure)是一个函数以及其捆绑的周边环境状态的引用的组合。简单说,闭包让开发者可以从内部函数访问外部函数的作用域。
请看代码:
<script>
// 闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)
// 的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,
// 闭包会随着函数的创建而被同时创建。
function outer(){
// 外部函数中的局部变量
let n = 10
// 内部函数
function inner(){
// 内部函数访问外部函数的局部变量
console.log(n);
}
// 将内部函数return出去,这样外部才能调用
return inner
}
let fn = outer();
console.log(fn);
fn()
</script>
下面来介绍闭包的作用:
1·作用: 解决变量污染问题,让变量被函数保护起来
let count = 0
setInterval(function (){
console.log(count++);
},1000)
————以上代码中的count是一个使用频率很高的变量名
2·为了避免和其他位置的代码冲突,可以在使用一个函数把以上的代码包裹起来
function fn() {
let count = 0
setInterval(function(){
console.log(count++);
},1000)
}
fn()
作用2: 可以延长变量的生命周期
变量的声明周期
(全局变量: 从声明开始一直到页面关闭)
(局部变量: 从声明开始一直到函数执行结束)
// 【全局变量】
// 全局变量n 写在函数外面
let n = 18;
function ck(){
console.log(n);
}
// 函数内部可以访问到全局变量
ck() //10
// 【全局变量】
function out(){
// 全局变量: 特点1-只可以在函数内部访问
// 特点2-函数执行结束后就会被销毁
let b = 20;
// 内部访问局部变量
console.log(b); //20
}
outer();
// 函数作用域外,访问局部变量
// console.log(b);
// 函数作用域外,访问局部变量x
// console.log(b);
// 【将上述情况变成闭包函数,定义一个内部函数,让其访问到外部函数的局部变量
function outer (){
let b = 20;
function inner(){
console.log(b);
}
return inner
}
let ckb = outer()
console.log(b);
</script>
作用3: 提供了有限的访问权限
function data(){
let age = 18
// 读取数据
function getAge(){
return age
}
// 设置数据
function setAge(n){
// 在赋值时,所赋的值进行合理的检验
if(n>0 && n<100){
age = n
}
}
// 返回一个对象到外部 对象带着两个内部函数
return {
getAge:getAge,
srtAge:setAge
}
let op = data();
op.setAge(80)
console.log(op.getAge());
}
</script>
闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
因此,通常你使用只有一个方法的对象的地方,都可以使用闭包。
在 Web 中,你想要这样做的情况特别常见。大部分我们所写的 JavaScript 代码都是基于事件的 — 定义某种行为,然后将其添加到用户触发的事件之上(比如点击或者按键)。我们的代码通常作为回调:为响应事件而执行的函数。