javascript的进阶闭包
在js中的闭包是一个一直研究的话题,闭包的也是web进阶中的一个必须的手段,浏览器的垃圾回收机制会将不用的函数回收掉,可以说这样的功能是一把双刃剑,好处与坏处是同样存在的;而闭包就是解决回收的一种方法。
总结一下闭包特点
1、实现公有变量。
2、可以做缓存,存储结构。
3、可以实现封装,属性私有化。
4、模块化开发,防止污染全局变量。
闭包的常用模式
IIFE
(function (){
//代码块
})()
常见
(function (){
//代码块
}())
通过在函数中创建函数,并返回来延迟作用域链的存在时间(掌握执行环境/作用域链/this/活动对象/arguments/全局对象概念的理解)
html4的时候下面的代码块基本是我们经常写的
for (var i=1; i<=5; i++) { (function() {
var j = i;
setTimeout( function timer() {
console.log( j );
}, j*1000 );
})();
}
//优化后的
for (var i=1; i<=5; i++) { (function(j) {
setTimeout( function timer() { console.log( j );
}, j*1000 );
})( i );
}
属性的私用化和块级别的作用域
//没有es6的时候能够产生块级作用域的方式,除了闭包的方式外就剩下 try{}catch(err){}中的catch的产生的作用域了,
try {
undefined(); // 执行一个非法操作来强制制造一个异常
}
catch (err) {
console.log( err ); // 能够正常执行!
}
//模块
function CoolModule() {
var something = "cool";
var another = [1, 2, 3];
function doSomething() {
console.log( something );
}
function doAnother() {
console.log( another.join( " ! " ) );
}
return {
doSomething: doSomething, doAnother: doAnother
}; }
var foo = CoolModule(); foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3