应用场景一: 典型应用是模块封装,在各模块规范出现之前,都是用这样的方式防止变量污染全局。
var Yideng = (function () { // 这样声明为模块私有变量,外界无法直接访问 var foo = 0;
function Yideng() {}
Yideng.prototype.bar = function bar() {
return foo;
};
return Yideng;
}()); 应用场景二: 在循环中创建闭包,防止取到意外的值。
如下代码,无论哪个元素触发事件,都会弹出 3。因为函数执行后引用的 i 是同一个,而 i 在循环结束后就是 3
for (var i = 0; i < 3; i++) { document.getElementById('id' + i).onfocus = function() { alert(i); }; } //可用闭包解决 function makeCallback(num) { return function() { alert(num); }; } for (var i = 0; i < 3; i++) { document.getElementById('id' + i).onfocus = makeCallback(i); }