闭包和立即执行函数

  01 Jul 2017


闭包

闭包是指:在一个函数内部,有能够访问外部作用域中的变量的函数。

特点:即使外部函数执行完毕,由于闭包的存在(引用外部函数的变量),该变量的引用将存在于闭包的作用域里直至闭包销毁。

所以就会出现像下面这个例子那样:outerFn执行完毕了,但是c函数还是可以访问b变量。

function hehe(){
   var b=1;
return function(){
   b++;
   console.log(b);
}
}
var c=hehe();
c();//2
c();//3
c();//4

立即执行函数

即时函数是指定义完了立即调用的匿名函数,往往用它来开辟一个独立的作用域(命名空间)。即时函数是为了形成块级作用域,来弥补js函数级作用域的局限

(function() {
    var a = 1;
}());
console.log(a);  // Uncaught ReferenceError: a is not defined

立即执行函数执行完毕之后,在函数外部无法访问内部的局部变量(注意:局部变量)

function hehe(){
   var b=1;
return (function(){
   b++;
   console.log(b);
})();
}
hehe();//2

内部函数自执行,也可看出它是个闭包,只是这里内部函数执行完一次后就销毁了。

实际上,人们经常用即时函数来构造闭包。为什么呢?因为即时函数只能执行一次,执行完了立马消失,所以不会重复创建闭包,也不会对当前作用域造成任何污染。

相同点:他们都是函数的一种特殊形态,并且可以共存。而且闭包配合即时函数“口味更佳”。 不同点:即时函数是定义一个函数,并立即执行。它只能被使用一次,相当于“阅后即焚”。闭包是指一个函数与它捕获的外部变量的合体,按照MDN的说法,闭包就像一个对象—一个具有一个方法(行为)和一个或多个私有字段(状态)的对象。从这个角度看,闭包是符合面向对象的封装思想的。