关于闭包,实在没想清楚为什么出来是10? <script > var arr = [] for(var i=0;i<10;i++){ arr.push(function(){ console.log(i) }) } arr[6]();//10 </script> 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 数字里面每个元素是一个匿名函数,当你执行arr[6]里面的函数的时候,i的值这个时候已经实际变成了10了啊,因为循环早已经结束了。换言之,10个数组里面的函数,访问的都是同一个变量i,而不是10个变量,访问i的时候,i的值已经变成了10. 输出10就是因为没有用闭包。原因楼上已经说的很清楚了。解决方法也就是加上一居闭包,让每次循环都单独在一个闭包内产生一个i变量。 var arr = [] for(var i=0;i<10;i++){ (function(i){ arr.push(function(){ console.log(i) }); })(i); } 或者是把i改成let块作用域变量,其原理与闭包一样。 var arr = [] for(let i=0;i<10;i++){ arr.push(function(){ console.log(i) }) } var arr = [] for(var i=0;i<10;i++){ arr.push(function(){ console.log(i) }) console.log(arr[i]()) }在你里面执行每次push进去一个函数的时候,直接调用这个时候,所得到的的就是你想要的值,循环完之后 在调用,这个时候 i 已经是10,不管你调用的是 arr[1]() .... arr[6]都是10 var arr = [] for(let i=0;i<10;i++){ arr.push(i) } https://www.cnblogs.com/fly_dragon/p/8669057.html 有没有人用alex的语法高亮插件 javascript 长数的乘法计算出现错误 Jquery dialog 的显示问题 如何能过JS提交表单 是IE的BUG还是我的BUG? jsValidation framework 路径配置问题 如何将获得的一段文字分成2段放入2个文本框里 怎么做到添加表格行后又个按钮能删除当前行?? 急,各位大侠:这段代码为何不能在ie5下使用,多点几下ie5就说出错 任何用java写目录树(viewtree)————简单问题得高分!!!! 怎么用完成价格日历 vuecli中,父组件调用子组件的请求方法
解决方法也就是加上一居闭包,让每次循环都单独在一个闭包内产生一个i变量。
var arr = []
for(var i=0;i<10;i++){
(function(i){
arr.push(function(){
console.log(i)
});
})(i);
}
或者是把i改成let块作用域变量,其原理与闭包一样。
var arr = []
for(let i=0;i<10;i++){
arr.push(function(){
console.log(i)
})
}
var arr = []
for(var i=0;i<10;i++){
arr.push(function(){
console.log(i)
})
console.log(arr[i]())
}在你里面执行每次push进去一个函数的时候,直接调用这个时候,所得到的的就是你想要的值,循环完之后 在调用,这个时候 i 已经是10,不管你调用的是 arr[1]() .... arr[6]都是10
for(let i=0;i<10;i++){
arr.push(i)
}