js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

时间:2023-03-08 15:33:06

js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

一、总结

需要好好看下面代码

本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环执行完之后的i,所以不是正确结果

而直接执行匿名函数的方式当场就拿到了正确的i,闭包的方式也是因为将外部函数的变量保存在内存中从而可以得到正确的i

1、直接执行匿名函数的方式闭包的方式都可以得到正常的结果

2、普通方式因为循环已经执行完成,所以得到的结果(用到的循环中的变量i)都是i执行完最后的结果

3、闭包的方式需要传参

闭包的方式

1.这里的匿名函数有一个参数 n,也就是最终将返回的结果数值;

2.在调用每个匿名函数时传入变量i

3.变量i的当前值会赋值给n,

4.匿名函数内部创建并返回了一个访问n的闭包

5.如此数组arr中的每个函数中都有了自己的n变量的一个副本(闭包可以将局部变量贮存在内存中)

二、js循环函数中的匿名函数和闭包问题

代码

 <!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>课堂演示</title>
</head>
<body>
<script>
/*
function fun(){
var arr=[];
for(var i=0; i<5; i++){
arr[i]='元素'+i;
}
return arr
} alert(fun()) // 循环里包含匿名函数
function fun(){
var arr=[];
for(var i=0; i<5; i++){
arr[i]=function(){
return '元素'+i;
}
}
return arr
}
//alert(fun())
//输出一个包含五个匿名函数的数组
// arr = [function,function,function,function,function]; var Bb=fun() //循环已经执行完毕,此时的i已经变成4++变为为5
//alert(Bb);
//alert(Bb[0]);alert(Bb[1]);alert(Bb[2]);
//alert(Bb[0]());alert(Bb[1]());alert(Bb[2]()); // for(var i=0; i<5; i++){
// alert(Bb[i]) // arr[i]得到的只是没有执行的匿名函数function(){};
// }
alert(Bb.length)
for(var i=0; i<5; i++){
alert(Bb[i]()) // Bb[i]()将得到的匿名函数执行,但是并没有得到想要的结果,全都是[元素5]
} //让匿名函数立即执行来赋值
function fun(){
var arr=[];
for(var i=0; i<5; i++){
arr[i]=(function(){
return '元素'+i;
})() //匿名函数立即执行,函数参数按值传递,故将当前值返回
}
return arr
}
var Bb=fun()
alert(Bb.length)
alert(Bb)
// for(var i=0; i<5; i++){ // alert(Bb[i])
// }
*/ //通过闭包让局部变量驻留在内存中
function fun(){
var arr=[];
for(var i=0; i<5; i++){
arr[i]=function(n){
return function(){
return '元素'+n;
}
}(i)
}
return arr
}
var Bb=fun()
//alert(Bb.length)
// alert(Bb[0]())
for(var i=0; i<5; i++){
//alert(Bb[i])
alert(Bb[i]())
}
//这次成功的输出了 ‘元素0 元素1 元素2 元素3 元素4 ’,而不再都是[元素5]
/*
87 1.这里的匿名函数有一个参数 n,也就是最终将返回的结果数值;
88 2.在调用每个匿名函数时传入变量i
89 3.变量i的当前值会赋值给n,
90 4.匿名函数内部创建并返回了一个访问n的闭包
91 5.如此数组arr中的每个函数中都有了自己的n变量的一个副本(闭包可以将局部变量贮存在内存中)

*/
</script>
</body>
</html>