我所理解的‘闭包’

一、什么是闭包?

  我相信有很多小伙伴和我一起,找了很多‘闭包’的字面解释,当时看了之后,感觉记住了。但是过段时间又忘了‘闭包’是什么了?所以现在你就只用记住一句话:“闭包允许函数访问局部作用域之外的数据”。

现在我们来看一段闭包的代码:

function makeName (){
  let name = ‘zhangsan‘;
  function displayName(){
    alert(name);
  }
  return displayName;
}

var fun = makeName();
fun();

此时运行浏览器它会显示告警:

不对呀,按照我们对JavaScript“全局作用域”以及“局部作用域”的理解,全局环境怎么能访问到局部环境的“name”呢?没错,这就是JavaScript最强大特性之一的闭包了。

它允许我们访问之前我们访问不到的数据,那么闭包是怎么做到的呢?我们来看这样一张图:

在声明函数时,JavaScript会为函数生成一个作用域链,这个作用域链是一个数组形式的,他会指向函数的局部对象和全局对象。函数运行完成时就会销毁这个作用域链,但是如果我们把另一个函数displayName作为返回值并且持有makeName的name对象

那么在makeName函数运行完成之后本来应该销毁的局部对象name就不会被销毁,name会存在于displayName函数的作用域中,所以当我们接受displayName函数之后并且试图访问name变量时,就会去displayName函数的作用域链中去找这个对象,那么自然就找到了。不能被销毁也就意味着脚本中闭包函数要比非闭包函数需要更多的内存开销,所以我觉得如果不是必要,尽量不用闭包。但是闭包这个概念要理解。

本文参考了《高性能JavaScript》,如果本文有任何问题欢迎大家批评指正。    —— 一个热爱代码的小学生;

原文地址:https://www.cnblogs.com/lizixiang/p/10449339.html

时间: 2024-10-23 08:36:03

我所理解的‘闭包’的相关文章

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关引用环境组成的实体. 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量. Java中闭包实现 关键点: 如何用变量去存储方法? java中能够保存方法的变量指的就是普通的对象 如何让这个普通对象能够访问所在类的自由变量?

理解js闭包原理

各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁. 闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中. 怎么来理解这句话呢?请看下面的

轻松理解JavaScript闭包

摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数.下面列举出常见的闭包实现方式,以例子讲解闭包概念 function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 f1是

javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

理解JAVASCRIPT 闭包

最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念"闭包". 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这句话是我自己总结的,或许不太准确. 你能看到的多少这句话该如何理解呢? 下面随便丢一段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var name="Peter"; funct

深入理解Javascript闭包概念

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

深入理解javascript闭包(一)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.什么是闭包? 官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的"闭包". 要理

Python_基础个人理解_闭包

闭包 ---- 个人理解简述 闭包在某种含义上其本身其实也是一个函数. 定义的格式简单来说为在一个函数内部再创建一个函数, 也就是一个外函数包裹了一个内函数, 在内函数里使用了外函数的临时变量, 外函数的"return"返回值为内函数的引用(函数名). 在形式上与循环嵌套有些相似, 暂且也可称之为函数嵌套. 闭包的使用可以有效的隐藏函数内部的工作细节, 只给外部使用者提供一个可以执行的内部函数的应用. 如果在外函数里自定义了变量并且需要在内函数中对其进行修改, 需要将变量声明为 &qu

深入理解javascript闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

javascript深入理解js闭包

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数