前端最疑惑的面试题:请讲出你在工作中使用闭包的例子?求给个例子

闭包在工作中的使用例子,这是面试官问我的,说实话,工作中我基本没用过,但是我知道闭包的原理。说起使用场景,我还真不知道。求大神指点些例子。

阅读 3.9k
7 个回答

使用闭包要么是为了访问函数内部的变量、要么是为了将一个变量保存在内存中,或者保护函数内部变量;
1、平时在我们封装功能函数时,为了不让全局变量混乱,污染全局作用域,这时候可以使用闭包代替全局变量(JQuery内部的封装就是如此);
2、还有常用的就是为了创建出类似块级作用域(即为一个nodelist对象列表中的每一个元素绑定事件时);
3、高价函数的使用也是有所体现的。
…………平时我们使用闭包的方面还是比较多的,不知不觉中其实你就已经创建了闭包

首先,可能题主把闭包看得太狭义了,有些常见模式其实也是闭包。不过,平心而论,以前典型的闭包用法(存状态)现在确实废弃了。

是什么

闭包的定义是“函数和声明该函数的词法环境的组合” 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()还是有副作用的呀,得到的值还是不一样,好处在哪?好处在于

  1. bar前面是什么?是一个对象state,我们现在能确定bar的副作用在哪里了;
  2. bar本身没有副作用,只要我们深拷贝state,我们就能历史回放state.bar()是怎么出bug的。

以上两点简直是debug的福音。

所以,React强推class,Vue用的也是this,都用对象存状态。既然状态都被对象存了,以前典型的闭包用法(存状态)自然就废弃了。

https://segmentfault.com/a/11...

工作中闭包的使用很多,比如:函数柯里化、函数节流啦。点击事件里面操作函数啦

新手上路,请多包涵

用javascript 写回掉

闭包可以保证内存常驻,所有和内存常驻有关的都可以用闭包,比如循环中的结果数据缓存,比如网站访问统计。

闭包你应该天天都在用,js的模块就是用闭包实现的,随意拆出一个webpack打包的js中的模块

/***/ (function(module, exports, __webpack_require__) {
"use strict";
console.log('555555');
/***/ })

最早的jq 都是用闭包的写法

推荐问题
宣传栏