博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
7208
积分:0
P豆:617

闭包的作用和原理

2021年10月18日 20:44:13阅读数:13博客 / Sky

相关问题

什么是闭包闭包的应用

回答关键点

作用域 引用 函数

作用:能够在函数定义的作用域外,使用函数定义作用域内的局部变量,并且不会污染全局。

原理:基于词法作用域链和垃圾回收机制,通过维持函数作用域的引用,让函数作用域可以在当前作用域外被访问到。

知识点深入

1. 作用域

作用域:用于确定在何处以及如何查找变量(标识符)的一套规则。词法作用域:词法作用域是定义在词法阶段的作用域。词法作用域是由写代码时将代码和块作用域写在哪里来决定的,因此当词法作用域处理代码是会保持作用域不变(大部分情况)。块作用域:指的是变量和函数不仅可以属于所处的作用域,也可以属于某个代码块(通常用{}包裹)。常见的块级作用域有 with,try/catch,let,const 等。函数作用域:属于这个函数的全部变量都可以在整个函数范围内使用及复用(包括嵌套作用域)。作用域链:查找变量时,先从当前作用域开始查找,如果没有找到,就会到父级(词法层面上的父级)作用域中查找,一直找到全局作用域。作用域链正是包含这些作用域的列表。

2. 什么是闭包

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使是函数在当前词法作用域外执行。 ——《你不知道的 JavaScript》

function foo() {
 var a = "hzfe";
 function bar() {
   console.log(a);
 }
 return bar;}var baz = foo();baz(); // hzfe

在这个例子中,函数 bar 作为返回值返回后,在自己定义的词法作用域以外的地方执行。一般来说,在函数 foo 执行后,通常会期待函数 foo 的整个内部作用域被引擎回收机制销毁。而闭包可以阻止这件事情的发生。事实上内部作用域依然存在,因为函数 bar 本身在使用,所以并不会被回收。

在 JavaScript 中,每当创建一个函数,手机游戏账号转让平台闭包就会在函数创建的同时被创建出来。

3. 闭包的应用

无论何时何地,如果将函数作为返回值,就会看到闭包在这些函数中的应用。在定时器,事件监听器,ajax 请求,跨窗口通信,web workers 或者任何其他的异步/同步任务中,只要使用了回调函数,实际上就是使用闭包。使用闭包的例子可以参考实现节流防抖函数。

TIPS: 闭包与执行函数关系

var a = "hzfe";(function IIFE() {
 console.log(a);})();

通常认为立即执行函数(IIFE)是典型的观察闭包的典型例子,但严格来说并不是。虽然创建了闭包,但没有体现出闭包的作用。因为函数并不是在它本身的词法作用域以外执行的。
它在定义时所在的作用域中执行,而非外部作用域。

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • JavaScript在javascript中,如果对弄不清楚,写代码就会出很多问题,今天对做一个总结。
    JS 就是在A执行完并返回后,使得Javascript垃圾回收机制不会收回A所占资源,因为A内部函数B执行需要依赖A中变量,如果不使,B函数执行所依赖变量会造成全局污染。
    普通函数区别?(详解及实例)​》,本文继续给大家介绍什么是函数?函数是什么?(附代码)有需要朋友可以参考一下,希望对大家有所帮助。
    ​下面由golang教程栏目给大家介绍golang中意义法,希望对需要朋友有所帮助!Go 函数可以是一个是一个函数值,它引了函数体之外变量。
    本篇文章带大家了解一下Node.js工具 npm yarn 使方法,带大家快速入门npm yarn。
    在javascript中,不是域,而是一个能够持续存在函数上下文活动对象,是同时含有对函数对象以及域对象引对象。主要是来获取域链或型链上变量或值。
    大多数人都知道Node.js中require()函数做什么,但是有多少人知道它呢?我们每天使它加载库模块,但是它内部行为很神秘。
    概念,MDN 上对定义,解为:一个函数及其周围封词法环境中构成
    大多数人都知道Node.js中require()函数做什么,但是有多少人知道它呢?我们每天使它加载库模块,但是它内部行为很神秘。
    python装饰器就是于拓展来函数功能一种函数,目是在不改变函数名(或类名)情况下,给函数增加新功能。装饰器本质上就是一个是装饰器核心。
    执行上下文执行栈是 JavaScript 中关键概念之一,是 JavaScript 难点之一。 解执行上下文执行栈同样有助于解其他 JavaScript 概念如提升机制、等。
    js中closure,是指函数变量可以保存在函数域内,因此看起来是函数将变量“裹”了起来,根据定义,含变量函数就是
    上篇文章给大家介绍了《什么是函数?函数是什么?(附代码)》,本文继续给大家介绍什么是匿名回调?回调函数区别是什么?(附详解),加油,一起努力吧!
    信息一般处过程括对信息采集、存储、加工、传输。
    JavaScript模块化解是:1、Module模式,它通过特性打开了一个新域,缓解了全局域命名冲突安全性问题;2、CommonJS模式,主要在Node开发上,每个文件就是一个模块
    系统四大管功能不括“保存管”,操系统功能括处机管业管、存储管、设备管文件管;操系统核心中都有一组实现系统功能过程,括任务管、界面管、人机交互、图形界面、语音控制虚拟现实等
    称为箭头函数是PHP7.4版本将带来期待已久功能之一,它是由Nikita Popov、Levi MorrisonBob Weinan 提出,你可以在此处阅读RFC。
    javascript b是指,而是Javascript中比较重要一个概念,是一种保护私有变量机制,在函数执行时形成私有域,保护里面私有变量不受外界干扰。
    ​公众号迁移后账号还在。
    标题栏位于窗口最顶部,于显示当前应程序名、文件名等;在许多窗口中,标题栏也含程序图标、“最小化”、“最大化”、“还“关”按钮以及“帮助”按钮,可以简单地对窗口进行操