【自种树自乘凉】闭包

305 阅读2分钟

本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

立即执行函数(自调用函数)

(function(形参){
   // ...
})(实参);

这种函数将自动执行,不用等待被调用。

作用:制造出一个函数作用域,声明局部变量,防止污染全局变量。

闭包

(function(){
   var a = "变量";
   function fn() {
      console.log(a);
   }
})();

有一个局部变量 a,有一个函数 fn,fn 里面可以访问到 a 变量。

这就是一个闭包。

但我们在网上看见的常见的闭包写法是这样的(函数嵌套函数,然后 return 一个函数):

function fn() {
   var a = 1;
   function fn2() {
      a++;
      return a;
   }
   return fn2;
}

var fn3 = fn();
fn3();

这个写法中的 a 变量和 fn2 函数就组成了一个闭包。

总结一下就是:函数 + 环境(函数内部能访问到的变量),就是一个闭包。

为什么要函数嵌套函数呢?

是因为需要局部变量,所以才把 a 放在一个函数里,如果不把 a 放在一个函数里,a 就是一个全局变量了,达不到使用闭包的目的——隐藏变量。

所以函数套函数只是为了造出一个局部变量。

为什么要 return 呢?

因为如果不 return,你就无法使用这个闭包。把 return fn2 改成 window.fn2 = fn2 也是一样的,只要让外面可以访问到这个 fn2 函数就行了。

所以 return fn2 只是为了 fn2 能被使用。

闭包的作用

闭包常常用来间接访问一个变量,换句话说:隐藏一个变量,只暴露出一个访问器(函数)

上面的代码中 a 就是被隐藏的变量,fn2 函数就是访问器。

内存泄漏

现代浏览器中的闭包不会造成内存泄漏。