美文网首页
前端小白如何理解闭包

前端小白如何理解闭包

作者: 何小蒙 | 来源:发表于2021-07-15 15:12 被阅读0次

前言
假设阅读本文的你已经具备初级前端基础,了解作用域链执行环境全局变量活动变量等概念。(此处很想放链接,但是我手残还没写相关的解释文章,童鞋们自己搜一下吧)

先定义:

闭包是指:有权限访问另一个函数作用域中的变量的函数。

而要想了解闭包的概念,首先要对函数的执行流程有一定的了解。🤗

  • 函数的执行过程

以该函数为例:

function test (i, j) {
  return i + j;
}
var result = test(1, 2);

首先,在创建test()函数时,就会生成一个包括全局变量对象的初始作用域链,这个作用域链保存在test()函数内部的[[scope]]属性中。
test()函数被调用时,会创建一个执行环境和相应的作用域链(通过复制test()函数的[[scope]]属性中的值来构建),此后,会创建一个包含arguments, i, j的活动对象,这个活动对象会推入到作用域链的前端。
最后,一般来讲,当函数执行完毕之后,局部的活动对象就会被销毁,内存中只保留全局的变量对象。
这段话看起来比较绕口🤥,但是配合下面这张图看一下,瞬间会感觉特别清晰😃。

函数调用时的作用域链
  • 闭包

以上是一般的函数执行过程,❗但是对于闭包来讲,情况是稍微不同的❗,以如下函数为例:

function newTest (propertyName) {
  return function(obj1, obj2) {
    var val1 = obj1[propertyName];
    var val2 = obj2[propertyName];
    return val1 + val2;
  }
}

PS: newTest()函数内部创建了一个匿名函数,而匿名函数和闭包实际上是两个不同的概念。只是创建闭包的常见方式是通过匿名函数实现。

前面我们已经知道:闭包是有权限访问另一个函数作用域中的变量的函数

在上面的函数中,可以看到:

    var val1 = obj1[propertyName];
    var val2 = obj2[propertyName];

val1val2是访问了外部函数变量propertyName,而之所以val1val2可以访问到newTest()中的变量是因为,匿名函数的作用域链中包括了newTest()的作用域。所以,newTest()内部的匿名函数的作用域链中,实际上会包含newTest()的活动对象。

所以,当调用匿名函数时:

// 创建函数
var x = newTest('num');
// 调用函数
var result = x({num: 1},{num: 2}); // result: 3

匿名函数从newTest()被返回后,它的初始作用域链就会包括:①全局变量对象、②newTest()的活动对象。而且在newTest()被返回后,newTest()的执行环境的作用域链会被销毁,但newTest()的活动对象仍然会留在内存中,直到匿名函数被销毁后,newTest()的活动对象才会被销毁。例如:

// 解除匿名函数的引用,才会释放内存
x = null;

或许看文字还是容易混乱,配合图片理解更下饭🥰:


调用闭包时的作用域链

由于闭包会包括其他函数的作用域链,因此闭包会比其他函数更占内存,建议慎重使用。

✍后记:
本文知识点主要来源于红宝书,此篇也算是自己的笔记吧~
如果有小蒙理解错误的地方,请各位指点一下,感激不尽!❤❤❤

相关文章

  • 前端小白如何理解闭包

    前言假设阅读本文的你已经具备初级前端基础,了解作用域链,执行环境,全局变量,活动变量等概念。(此处很想放链接,但是...

  • 我从来不理解JavaScript闭包,直到有人这样向我解释它..

    摘要: 理解JS闭包。 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 ...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • [程序员每日5分钟]JS 中的闭包是什么

    闭包 是前端开发者面试必问的一个知识点。1、什么是闭包?2、闭包的作用是什么? 一、变量的作用域 你要学习和理解闭...

  • 如何理解闭包

    变量的声明周期 默认作用域消失时,变量就会被回收 如果变量被引用了,则不会被回收 局部变量在浏览器执行的时候才会被...

  • 如何理解闭包?

    如何理解闭包? 1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量...

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • JavaScript之闭包

    闭包 MDN面试官问我什么是闭包该如何回答廖雪峰博客-闭包阮一峰博客-闭包 个人理解 内部函数可以访问外部函数的作...

  • JavaScript闭包

    在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容。之前我对闭包的理解主要是"通过闭包可以在函数外部...

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

网友评论

      本文标题:前端小白如何理解闭包

      本文链接:https://www.haomeiwen.com/subject/ozmppltx.html