首页 > 试题广场 >

说一下闭包

在函数的内部可以访问全局变量,但是在函数的外部无法访问函数内部的局部变量。 有时候我们需要获取函数内部的局部变量,此时就要使用到闭包。 做法就是在函数内部再定义一个函数,这个函数就可以访问外部的变量,之后我们再把内部函数作为外部函数的返回值,这样就可以在外部函数中读取到局部变量了。 闭包就是定义在一个函数内部的函数,是连接内外函数的桥梁。
发表于 2020-02-24 11:14:24 回复(0)
让我用最土的话来给你解释解释什么是闭包?它有什么用?
闭包是函数内暴露至函数外的另一个函数,可以通过暴露出去的函数访问外部函数内的变量。

我在网上搜过不少关于闭包的具体定义,给大家总结一下我的理解,先举三个简单的例子,都作用到了闭包,可以先看一下他们的区别:

// 例子1:
var a;
function b(){
  var i = 0
  a = function(){
    alert(i);
  }
};
// 例子2:
function funA(){
  var m = 10;
  return function(){
    alert(m);
  }
};
// 例子3:
var lis = document.getElementsByTagName("li");
for(var i=0;i<lis.length;i++){
  (function(i){
    lis[i].onclick = function(){
      console.log(i);
    };
  })(i);
}

那么问题来了,到底什么是闭包?

  • 视觉上,闭包其实就是一个函数内部的函数,对,闭包其实就是个函数。上面的例子中,例1的 a 的值、例2被返回的函数、例3绑定给点击事件的回调函数统统都是闭包,因为它们都用到了上一层函数的变量,不过,仅仅用到了上一层函数的变量,可是不够的
  • 我们说,想成为闭包,可不是什么函数都可以的。网上很多帖子说内部函数要引用外部函数的变量,这句话说的就太片面了。
  • 若仅仅只是在内部函数中引入外部函数里的变量,这个内部函数我们不用一种方式,将它暴露出去,或者保存在外部变量中,再或者是保存到监听事件的回调中,那么我们在外部函数的同级作用域下,还是访问不到外部函数内的变量。所以!引用是其一,暴露,则是其二。这两点,缺一不可。
为什么说的这么复杂?怎么理解呢?
  • 闭包的初衷,不就在解决 “函数内的变量,在函数外无法访问”的问题嘛!
  • 所以,只要你能通过各种手段,让我们可以“在外部函数的同级作用域中,访问到这个内部函数”,借此来实现“在外部函数的同级作用域下,可以访问到外部函数内的变量”的效果。那么,我们也就实现了一个闭包。
编辑于 2023-11-07 11:26:25 回复(0)
a b 两个函数,b函数在a函数内部,并且b引用了a函数内定义的变量,使得这个变量没有因为a函数销毁而被释放,因此就产生了闭包。
发表于 2022-06-17 18:05:37 回复(0)
闭包的概念
官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包是指有权访问另一个函数作用域中的变量(参数)的函数
闭包就是能够读取其他函数内部变量(参数)的函数
闭包可以理解成定义在一个函数内部的函数
函数就是闭包

当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包。

需要明确的几点:
1. 闭包一定是函数对象
2. 闭包和词法作用域、作用域链、垃圾回收机制等息息相关
3. 函数内保持对上层作用域的引用   
4. 当函数在其定义的作用域外进行访问时,才产生闭包   
5. 闭包是由该函数和其上层执行上下文共同构成   
发表于 2020-08-14 08:39:20 回复(0)
<p>函数里面还有函数,里面这个函数就是闭包。闭包可以访问外层函数的变量</p>
发表于 2020-06-07 23:10:26 回复(0)
<p>闭包就是可以访问和操作其他函数内部变量的函数,因为在JS语言当中只有函数内部的子函数才可以访问和操作其局部变量,因此我们可以把闭包理解成:定义在一个函数内部的函数</p><p><br></p>
发表于 2020-06-02 21:02:05 回复(0)
引用了自由变量的函数是闭包;

换句话

闭包是有函数以及对其词法环境的引用构成;
发表于 2020-01-22 11:10:25 回复(0)

函数的内部函数

发表于 2019-10-11 09:54:33 回复(0)