再次聊聊闭包

106 阅读2分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

今天我们来聊聊经常说起的一个问题,关于javascript的闭包

其实很多文章都有说到这个,我的理解中,闭包就是一个函数

按照有些文章说的,闭包是指有有权限访问其他作用域中的变量的函数

注意这里涉及到一个概念叫做作用域,我们知道JavaScript是基于词法作用域的,在es6之前只有函数作用域和全局作用域的概念

所以定义在全局作用域中的函数都可以访问全局作用域中的东西,因此函数都是闭包,至于为什么或者说函数要不要返回或者返回什么,其实是没有要求

在小黄书上卷中提到的概念,其实不用太在意或者太去理解什么是闭包,非常认可它说的,闭包无处不在

但是为什么面试的时候,老是有这样的人问闭包相关的知识点呢,我觉得主要有以下几个原因:

  1. 闭包不好理解
  2. 闭包确实是一个知识难点,特别是当它返回的东西不同时

比如闭包可能会导致其他作用域在要释放的时候不释放

我们来看看相关的一个面试题吧

function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);

答案是16\

es6通常用let const块级作用域代替,闭包缺点,ie中会引起内存泄漏,严格来说是ie的缺点不是闭包的问题

也可以利用闭包私有化变量比如,

function fn(){
    var a = 0
    function innerFn(){
        a++;
        console.log(a)
    }
    return innerFn;
}
fn()()
var newFn = fn()
newFn()
newFn()

答案:1 1 2

到这里我们应该可以隐隐约约感觉到闭包的作用,但其他关于闭包的应用还有很多,这里仅是简单的的聊聊

好了,以上就是本文的内容,欢迎点赞评论和收藏,我们下期再见