1

closure | news view

 3 years ago
source link: https://zsqk.github.io/news/2020-05-12-higher-order-function.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

news view

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。

参考:MDN

闭包的特性

  • 函数嵌套函数
  • 函数内部可以引用函数外部的参数和变量
  • 参数和变量不会被垃圾回收机制回收

闭包的作用

  • 可以在函数的外部访问到函数内部的局部变量。
  • 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。

比如我们定义一个计数器,正常的写法

var count = 0;
function add() {
  return count += 1;
}
add(); // 1
add(); // 2

这样没问题,可以正常实现功能,也很简单方便。但是如果我们要同时实现多个计数器呢,总不能

var count = 0;
function add() {
  return count += 1;
}
var count1 = 0;
function add1() {
  return count += 1;
}
var count2 = 0;
function add2() {
  return count += 1;
}
...

这样一直写吧, 所以这时候就可以使用闭包来实现

function add() {
  var count = 0;
  return function() {
    return count += 1;
  }
}
var fn1 = add(); // 计数器1
var fn2 = add(); // 计数器2
fn1(); // 1
fn1(); // 2
fn1(); // 3
fn2(); // 1
fn2(); // 2
fn2(); // 3

最后总结一下闭包的好处与坏处

  • 保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
  • 在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
  • 匿名自执行函数可以减少内存消耗
  • 其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
  • 其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

- JavaScript

- closure

This site is open source. Improve this page.

Recommend

  • 8

    news view 看 GitHub 很少会看个人页. 知道 Arctic Code Vault Contributor 这件事还是在社区中. 社区中大多数人都有, 我也不例...

  • 3
    • zsqk.github.io 3 years ago
    • Cache

    Headless Brower | news view

    news view Headless Brower Headless Brower 直译为中文是无头浏览器。其中的无头是指没有图形界面的意思。也就是通过代码来控制与浏览器的交互。比如捕获页面内容加...

  • 4

    news view 多设备开发时, 代码如何同步, 常用偏好如何同步, 怎么方便地进行切换. 这是个课题. 我大概有两种思路: 远程开发机. 编辑器同步设置. ...

  • 3
    • zsqk.github.io 3 years ago
    • Cache

    Deno | news view

    news view DENO 一个 JavaScript/TypeScript 的运行时 deno在5月13日发布1.0版本,经过简单的了解做一个简单的介绍。 Deno简介 deno官网对deno的定义如题,是一...

  • 5
    • zsqk.github.io 3 years ago
    • Cache

    HTTP/3 | news view

    news view HTTP3 是 HTTP 协议的最新版本。从诞生之初,HTTP 就是交换超文本文档的首选应用层协议。 多年来,为了跟上互联网的发展,以及 WWW 上交换的内容种类增加,HTTP 进行了几次重大升...

  • 2
    • zsqk.github.io 3 years ago
    • Cache

    Js Function | news view

    news view JS的几个常用方法 如果数组所有元素满足函数条件,则返回true。调用时,如果省略第二个参数,则默认传递布尔值。 const all = (arr, fn = B...

  • 5
    • zsqk.github.io 3 years ago
    • Cache

    Node Npm Cnpm Yarn Pnpm | news view

    news view node依赖管理 Node的依赖管理工具 使用一个名为package.json的文件,用户可以通过npm install –save命令把项目里所有...

  • 4
    • zsqk.github.io 3 years ago
    • Cache

    Next 50 Years | news view

    news view 《未来 50 年》读书总结 《未来 50 年》是一部文集,许多前沿领域的科学家们展望未来 50 年的科学成就和可能有所突破的技术领域。本书正是他们的思考汇聚而成。...

  • 3
    • zsqk.github.io 3 years ago
    • Cache

    Node | news view

    news view Node.js事件 什么是事件轮询 事件循环是 Node.js 处理非阻塞 I/O 操作的机制——尽管 JavaScript 是单线程处理的——当有可能的时候,它们会把操作转移到系...

  • 5
    • zsqk.github.io 3 years ago
    • Cache

    Cloudwatch | news view

    news view 什么是CloudWatch Amazon CloudWatch 实时监控您的 Amazon Web Services (AWS) 资源以及您在 AWS 中运行的应用程序。 可以使用 CloudWatch 收集和跟踪指标,这些指标是...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK