「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
今天我们来聊聊经常说起的一个问题,关于javascript的闭包
其实很多文章都有说到这个,我的理解中,闭包就是一个函数
按照有些文章说的,闭包是指有有权限访问其他作用域中的变量的函数
注意这里涉及到一个概念叫做作用域,我们知道JavaScript是基于词法作用域的,在es6之前只有函数作用域和全局作用域的概念
所以定义在全局作用域中的函数都可以访问全局作用域中的东西,因此函数都是闭包,至于为什么或者说函数要不要返回或者返回什么,其实是没有要求
在小黄书上卷中提到的概念,其实不用太在意或者太去理解什么是闭包,非常认可它说的,闭包无处不在
但是为什么面试的时候,老是有这样的人问闭包相关的知识点呢,我觉得主要有以下几个原因:
- 闭包不好理解
- 闭包确实是一个知识难点,特别是当它返回的东西不同时
比如闭包可能会导致其他作用域在要释放的时候不释放
我们来看看相关的一个面试题吧
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
到这里我们应该可以隐隐约约感觉到闭包的作用,但其他关于闭包的应用还有很多,这里仅是简单的的聊聊
好了,以上就是本文的内容,欢迎点赞评论和收藏,我们下期再见