自执行函数是闭包的应用。返回的对象在自执行函数体外部对函数体内部的变量有访问权。
但是在返回的对象上新定义的函数却不能访问到函数内部的变量,能解释下原理么?
var module = (function(){
var a = 1,
b = 2;
return {
getA: function(){
console.log(a);
},
getB: function(){
console.log(b);
}
};
})();
module.addA = function(){
a++;
}
module.addA(); //a is not defined
首先你需要了解的是什么叫做函数的作用域,函数在执行的过程中会创建一个相应的作用域链,局部的环境变量对象,仅在函数执行的过程中存在,当函数执行完成之后就会被销毁,并且被回收;但是闭包的局部变量并没有被销毁,如题主的示例,在自执行函数运行结束后,变量a、b,并没有被销毁,依然保存在内存中,因为返回的对象中,getA 函数和 getB 函数分别创建了对变量 a 和 b的引用。当执行 getA() 或 getB() 时,便可以通过该引用指针获取到变量 a 或 b。addA() 函数是在外部创建的,并没有创建对变量 a 的引用。 所以返回 is not defined。