闭包在工作中的使用例子,这是面试官问我的,说实话,工作中我基本没用过,但是我知道闭包的原理。说起使用场景,我还真不知道。求大神指点些例子。
闭包在工作中的使用例子,这是面试官问我的,说实话,工作中我基本没用过,但是我知道闭包的原理。说起使用场景,我还真不知道。求大神指点些例子。
首先,可能题主把闭包看得太狭义了,有些常见模式其实也是闭包。不过,平心而论,以前典型的闭包用法(存状态)现在确实废弃了。
闭包的定义是“函数和声明该函数的词法环境的组合” MDN,换言之,就是带着环境(上下文、状态、属性、局部变量,找一个你能理解的词)的函数。从ES2015起,最简单的闭包变成了这样:
{
let localVar = 1;
whatever.onclick = () => localVar++;
}
whatever.onclick
就是一个闭包,因为它带着localVar
。
从这个角度上来说,所有Javascript函数都是闭包,因为他们都能访问到window
下面的全局变量,如果传递给另一个框架的话,用的都是自带的全局变量环境。
上面的闭包非常糟糕,糟糕就在于它不是纯函数,它是有状态的。分散在各个闭包中的状态会成为bug的温床。以foo
为例,每次调用都会有副作用,得到的值都不一样,状态在哪里又找不着(假设你忘了localVar
是啥),给debug造成极大的困难。
现在主流的状态管理框架Flux/Redux/Vuex的思想全都是集中状态管理。还把状态分散到一个一个闭包里面,是过时的。
那我们把状态保存在哪里?this
里。
虽然this
也是JS的一个天坑,但是比起闭包来,简直好太多了。this
最伟大的功勋就在于函数和环境的解耦(跟闭包正好相反)。
let bar = function() { this.a++ }
let state = { a: 1, bar };
这个时候有同学就要问了,state.bar()
还是有副作用的呀,得到的值还是不一样,好处在哪?好处在于
bar
前面是什么?是一个对象state
,我们现在能确定bar
的副作用在哪里了;bar
本身没有副作用,只要我们深拷贝state
,我们就能历史回放state.bar()
是怎么出bug的。以上两点简直是debug的福音。
所以,React强推class
,Vue用的也是this
,都用对象存状态。既然状态都被对象存了,以前典型的闭包用法(存状态)自然就废弃了。
闭包你应该天天都在用,js的模块就是用闭包实现的,随意拆出一个webpack打包的js中的模块
/***/ (function(module, exports, __webpack_require__) {
"use strict";
console.log('555555');
/***/ })
8 回答4.9k 阅读✓ 已解决
6 回答3.6k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.5k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
5 回答1.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
使用闭包要么是为了访问函数内部的变量、要么是为了将一个变量保存在内存中,或者保护函数内部变量;
1、平时在我们封装功能函数时,为了不让全局变量混乱,污染全局作用域,这时候可以使用闭包代替全局变量(JQuery内部的封装就是如此);
2、还有常用的就是为了创建出类似块级作用域(即为一个nodelist对象列表中的每一个元素绑定事件时);
3、高价函数的使用也是有所体现的。
…………平时我们使用闭包的方面还是比较多的,不知不觉中其实你就已经创建了闭包