JavaScript模块
http://huasen.cc/article/interview#directory01088197526098022660
http://www.huggz.cn/?post=58
一、理解掌握闭包
一个函数对其周围状态(变量)的引用并保存周围变量,乃至函数执行完成后仍然可以访问的现象称之为闭包,闭包让外部访问函数内部的变量成为可能(私有属性),因为被引用的数据常驻内存,可能会造成内存泄露(一块内存长期被变量占据而不进行释放),闭包可以让你在一个内层函数中访问到其外层函数的作用域的状态并保存,在js中每当创建一个函数,闭包环境就在函数创建时产生,闭包环境相互独立,如果闭包环境引用外部函数作用域的一个变量a,即使当外部函数作用域的变量被销毁释放内存,但变量a不会被删除。
```javascript
// 第一题
function funA(){
var a = 10; // funA的活动对象之中;
return function(){ //匿名函数的活动对象;
alert(a);
}
}
var b = funA();
b(); //10
// 第二题
function outerFn(){
var i = 0;
function innerFn(){
i++;
console.log(i);
}
return innerFn;
}
var inner = outerFn();
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2(); //1 2 3 1 2 3
// 第三题
var i = 0;
function outerFn(){
function innnerFn(){
i++;
console.log(i);
}
return innnerFn;
}
var inner1 = outerFn();
var inner2 = outerFn();
inner1();
inner2();
inner1();
inner2(); //1 2 3 4
// 第四题
function fn(){
var a = 3;
return function(){
return ++a;
}
}
alert(fn()()); //4
alert(fn()()); //4
// 第五题
function outerFn(){
var i = 0;
function innnerFn(){
i++;
console.log(i);
}
return innnerFn;
}
var inner1 = outerFn();
var inner2 = outerFn();
inner1();
inner2();
inner1();
inner2(); //1 1 2 2
// 第六题
(function() {
var m = 0;
function getM() { return m; }
function seta(val) { m = val; }
window.g = getM;
window.f = seta;
})();
f(100);
console.info(g()); //100 闭包找到的是同一地址中父级函数中对应变量最终的值
//第七题
function a() {
var i = 0;
function b() { alert(++i); }
return b;
}
var c = a();
c(); //1
c(); //2
// 第八题
function f() {
var count = 0;
return function() {
count++;
console.info(count);
}
}
var t1 = f();
t1(); //1
t1();