小白自学:js中的闭包

前言

作为一名前端小白,我今天get到了js中的一个重要的知识点,那就是闭包,让我们从新梳理一下闭包的概念、作用和用法吧

什么是闭包?

闭包是 JavaScript 中的一个重要概念,它允许函数访问其外部作用域中的变量。换句话说,闭包可以捕获并存储其外部作用域的状态,即使在其外部函数执行完毕后仍然可以访问这些变量。

闭包的工作原理

要理解闭包的工作原理,我们首先需要知道 JavaScript 中的作用域链。当一个函数被创建时,它会创建一个作用域链,其中包含了它能够访问的所有变量和函数。当函数需要访问一个变量时,它首先会在自己的作用域中查找,如果没有找到,则会向上级作用域继续查找,直到找到该变量或者到达全局作用域为止。

闭包的实现就是通过维持对外部变量的引用来实现的。当内部函数(闭包)访问外部函数中的变量时,JavaScript 引擎会确保这些变量的引用不会被垃圾回收,即使外部函数已经执行完毕,这样就形成了闭包。

闭包的应用场景

闭包在 JavaScript 中有许多实际的应用场景,其中最常见的是在事件处理函数和回调函数中使用。通过闭包,我们可以轻松地将数据和行为封装起来,使得代码更加模块化和灵活。

示例:

让我们来看一个简单的示例,演示闭包在 JavaScript 中的应用:

javascript 复制代码
function outerFunction() {
    var value = "abc"
}
console.log(value) // 外部无法访问内部变量

如果改成下面的样子:

javascript 复制代码
function outerFunction() {
    var outerVar = 'I am from outer function';

    function innerFunction() {
        console.log(outerVar); // 内部函数可以访问外部函数的变量
    }

    return innerFunction;
}

var closure = outerFunction();
closure(); // 输出 "I am from outer function"

在这个示例中,innerFunction 是一个闭包,它可以访问外部函数 outerFunction 中的变量 outerVar,即使 outerFunction 已经执行完毕。 这是因为当outerFunction函数执行完成之后,存放代码执行的调用栈会将它清除,但是由于innerFunction函数里面有outerFuncion中需要的变量outerVar,所以就会形成一个类似于包裹的东西,将outerFunction保存下来,当后续代码执行时,就可以调用函数体内存有的变量,

闭包的一些常见应用方法

封装变量和函数:

闭包可以帮助我们封装变量和函数,以防止其被外部访问和修改。这种封装使得变量和函数成为私有的,只能在内部函数中访问,从而提高了代码的安全性和可维护性。

scss 复制代码
function createCounter() {
    let count = 0;

    function increment() {
        count++;
        console.log(count);
    }

    return increment;
}

let counter = createCounter();
counter(); // 输出 1
counter(); // 输出 2

在这个例子中,createCounter 函数返回了一个内部函数 incrementcount 变量被封装在 createCounter 的作用域内,并且只能通过返回的 increment 函数来访问和修改。这样可以防止外部直接修改 count 变量,从而确保了其安全性。

实现模块化和私有化:

闭包可以帮助我们实现模块化的代码结构,并且实现一些私有变量和函数,避免了全局命名空间的污染。

javascript 复制代码
let module = (function() {
    let privateVar = 'I am a private variable';

    function privateFunction() {
        console.log('I am a private function');
    }

    return {
        publicVar: 'I am a public variable',
        publicFunction: function() {
            console.log('I am a public function');
            console.log(privateVar); // 内部函数可以访问私有变量
            privateFunction(); // 内部函数可以调用私有函数
        }
    };
})();

console.log(module.publicVar); // 输出 'I am a public variable'
module.publicFunction(); // 输出 'I am a public function' 和 'I am a private function'

在这个例子中,我们使用立即执行函数创建了一个模块,模块内部包含了一些私有变量和函数,以及一些公有的接口(publicVar 和 publicFunction)。只有公有接口可以被外部访问,而私有变量和函数则对外部是不可见的,从而实现了模块化和私有化的效果。

结语

希望通过本文的介绍,你对 JavaScript 中的闭包有了更清晰的理解。闭包是 JavaScript 中非常有用的功能之一,它可以帮助我们更好地组织和管理代码,同时也能够解决一些特定的问题。继续学习和实践,你会发现闭包的强大之处,并能够熟练地运用它们来编写更加优雅和高效的 JavaScript 代码。

相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐4 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄5 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、5 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser7 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la7 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui7 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui