会飞的鱼

2020
Godam
首页 » 学习笔记 » Day 05 JS闭包

Day 05 JS闭包

前言

    学习JS的第。。天,今天这篇笔记是在极其艰难的情况下写的(趴着玩电脑?),今天学习到了JavaScript闭包,看到讨论很多,也查阅了一些资料,做做笔记吧。

正文

什么是闭包?

    这里就直接给出大家百度百科中对闭包的解释吧:闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

    感觉其精髓就是,函数的内部变量可以在外部使用(昨天写了关于变量作用域的笔记,大家可以看一下)。

问题引入

    我们经常会遇到一些需要使用计数器的场景,可以通过以下方式来定义一个计数器:

var counter = 0;
 
function add() {
   return counter += 1;
}
    这样,直接调用add函数便可以实现计数的功能了,但此时作为计数器的变量counter被声明为了一个全局变量,任何函数都可以修改它,这就变得十分危险了。这样的话我们想到之前的变量作用域问题,便想到将其封装进一个函数内部,仅使计数器函数可以访问到他:



function add() {
    var counter = 0;
    return counter += 1;
}


    这样来看似乎是没有问题了,但无论我们调用多少次add,其中计数器的值都是1,百度了一下发现,为了节省内存空间,JS中创建的函数私有作用域在其使用结束后便被销毁了,那应该怎么办呢?

使用闭包

    首先,我们来简述一下如何使用闭包


  • 在函数①的内部在定义一个函数②
  • 将函数②作为函数①的返回值


    具体代码示例如下所示:

function add() {
    var counter = 0;
    return function () {
    return counter += 1;
    }
}
var a = add;
     函数②被包含在函数①中,函数①中的局部变量对函数②是可见的,因此函数②可以实现对counter的改变,而外部函数却无法直接访问变量counter。


总结

    闭包的实现似乎使得函数在调用后其内部空间并不会被释放,而其中变量的值一直存在,因此可以实现累加器的功能并保护累加器不受其他函数干扰。

文章如无特别注明均为原创! 作者: 果果, 转载或复制请以 超链接形式 并注明出处 GODAM|博客|godam
原文地址《 Day 05 JS闭包》发布于2020-3-4

分享到:
打赏

评论

游客

切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册

sitemap