js高级-闭包
function foo(x){
var tmp = 3;
return function(y){ //把一个函数作为返回值,定义时候的作用域
console.log(x+y+(++tmp)) //++tmp先自加再参与表达式运算
}
}
var bar = foo(2) //此时bar指向了匿名函数,匿名函数又指向了 x,tmp两个变量 bar就是一个闭包(匿名函数加x,tmp两个父级变量)
bar(10) //16
bar(20) //27 此时函数执行完成后里面的变量没有回收掉 所以tmp还是4 然后++tmp就是5 x还是2 y就是20 (只要bar没有释放里面的变量就不会回收 。关闭浏览器才会释放)
function d(){
var a = 10;
console.log(a)
}
d(); //执行完成后 a会被回收 浏览器关闭函数会被回收 函数+引用的变量就会形成闭包
闭包的应用
匿名函数自执行
var t = function (a){ //污染全局 尽量不要定义全局变量
console.log(a)
}
t(9);
//尽量少的定义全局变量 例如 jQuery 只定义了 $,jQuery两个
;(function(a){
console.log(a)
})(3)
1、循环注册dom事件
<ul>
<li></li>
<li></li>
</ul>
var lis = document.querySelectorAll('li')
for(var i=0; i<lis.length; i++){
//典型错误
lis[i].onclick = function(){ //事件的方法执行是:当事件触发的时候执行 绑定事件只有点击才执行。 是异步的 当事件触发的时候 i的值为lengh长度了
console.log(i) //变量i是父函数里面的变量
}
//正确
(lis[i].onclick = function(a){ //做成自执行函数来注册事件
console.log(a)
})(i)
}
for(var i = 0; i< 10; i++){ //典型错误
setTimeOut(function(){
console.log(i)
},1000)
}
for(var i = 0; i< 10; i++){ //匿名自执行函数解决
(function(a){
setTimeout(function(){
console.log(a)
},1000)
})(i)
}