晚上无聊,刚刚看完高程的闭包。感觉不知不觉离上次看闭包已经过去四个月。。。今天再次总结下- -
上一篇总结地址:javascript闭包
什么是闭包
我的理解就是:子作用域读取父作用域中的变量。
简单来说就是:javascript
中有个很特别的地方。局部作用域可以访问全局作用域,但是全局作用域不能访问局部作用域的值,如果想要访问。就只能通过闭包啦。
一道经典的例子
不明白?那就先来看看这个例子1
2
3
4
5for(var a=0;a<3;a++){
setTimeout(function(){
console.log("zone")
},0)
}
当在chrome
浏览器中运行的时候,我们发现结果并不是我期望的0,1,2
而是:
这里的原因主要是:setTimeout
读取a
是动态读取的。当我读取的时候,其实此时for
循环已经结束了,全局的a
已经变成3。
解决办法:
闭包解决。
这里就需要用到闭包来解决问题。1
2
3
4
5for(var a=0;a<3;a++){
(function(num){(setTimeout(function(){
console.log("zone")
},0)})(i)
}
这里其实也就是为每个闭包单独创建了一个作用域。把a
给保存了下来。
bind解决
其实除了 上面那种 还有js值的传递
和利用闭包读取到父级作用域的集合,然后在集合中寻找自己
不过突然发现前几个月已经用这种方法实现过了- -
不过现在又有了一种新的方法1
2
3for(var a=0;a<3;a++){
setTimeout(console.log.bind(null,a),0)
}
这里就相当于强制绑定参数a。其实和利用闭包构建方法类似,不过我感觉在实际工作中貌似bind
会更加好用。毕竟这样比较cool
关于bind
的具体用法 直接看MDN
文档吧。bind的具体用法
今天周六。上完班就休息啦0.0