Js闭包

190 阅读2分钟

闭包的定义

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使这个函数是在当前词法作用域之外执行。

再来说的直白一点,闭包就是一个有权限访问其所在词法作用域中变量的一个函数。

通过代码片段理解:

function foo(){
    var a=3;
    function bar(){
        console.log(a);
    }
    return bar;
}
const a=foo()
a()

foo函数执行之后返回值是bar函数,把bar函数传给变量a并进行调用。引用类型的特性我们知道bar和a本就是指的同一个函数。也就是说bar函数在自己词法作用域以外的地方被执行了。

​ 一般一个函数执行后,它的整个内部作用域都会被销毁,因为js引擎的垃圾处理机制。但是这里的foo函数明显没有垃圾处理。

​ 闭包的主要功能就是在这,因为bar函数仍要对此块作用域进行引用。使得这块本应消失的空间被保存了下来。

闭包的作用

  1. 可以读取函数内部的变量
  2. 让这些变量的值始终保持在内存中。

闭包的优缺点

优点

  • 阻止一些词法作用域的回收,保存一些有用信息,模拟一个块级作用域。

缺点

  • 可以说闭包的优点也是它的缺点,因为他会保存一些信息始终在内存中。故如果出现过多的闭包会导致内存泄漏。

常见的闭包相关问题

1.常见面试题

for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}

2.回调函数是不是一个闭包?闭包可以调用回调函数吗?

参考:

精华提炼「你不知道的 JavaScript」之作用域和闭包

深入刨析闭包

为了前端的深度-闭包概念与应用

50行代码的MVVM,感受闭包的艺术

深入理解JavaScript闭包之什么是闭包

深入理解JavaScript闭包之闭包的使用场景

翻译系列之你能回答7个闭包的面试题么?

JavaScript 的静态作用域链与“动态”闭包链