前端面试 【JavaScript】— 闭包有哪些表现形式?

2021-11-19 16:02:29 浏览数 (1)

在真实的场景中,究竟在哪些地方能体现闭包的存在?

1. 返回一个函数;

代码语言:javascript复制
function f1() {
  var a=2;
  return function f2() {
    console.log(a);
    //2  
  };
};
var num=f1();
num();

2. 作为函数参数传递;

代码语言:javascript复制
var a = 1;
function f1() {
  var a = 2;
  function f2() {
    console.log(a);
  };
  f3(f2);
};
function f3(fn) {
  fn();
};
f1();
// 2

3. 在定时器、事件监听、Ajax请求、跨窗口通信、Web Workers或者任何异步中,只要使用了回调函数,实际上就是在使用闭包;

以下的闭包保存的仅仅是window和当前作用域:

代码语言:javascript复制
// 定时器
setTimeout(function timeHandler(){
  console.log('定时器');
},100);

// 事件监听
$('#app').click(function(){
  console.log('事件监听');
});

4. IIFE(立即执行函数表达式)创建闭包,保存了全局作用域 window 和 当前函数 的作用域,因此可以使用全局的变量。

代码语言:javascript复制
var a=2;
(function IIFE(){
  console.log(a);
  // 2
})();

0 人点赞