猿问

请教一个js里的循环问题。

var arr = [] ;
for(var i=0;i<10;i++){
	arr[i] = function(){
		console.log(i)
	}
}
arr[5]() //这个打印结果为什么是10而不是5


慕田峪8701529
浏览 1678回答 3
3回答

安然桑丶

因为此时循环结束后, i是10, 因此不管你调用`arr[5]()`还是`arr[6]()`都是打印10. 解决这种问题 ES3/5 可以使用闭包和自执行函数. 最简洁的还是将`var`声明替换为`let`. 不过这是ES6的语法.ES3/5方式:var arr = [] ; for(var i=0;i<10;i++){   arr[i] = (function(i){     return function () {       console.log(i)     }   })(i) } arr[5]()    // 5 arr[9]()    // 9

慕勒7123956

你把var变成let 就是你想要的了,因为函数里面只是一个console.log() 动作.里面的变量i是这10个函数公用的一个变量。所以循环结束,i就变成了10.用let的话,就是把每一个循环变成了块级作用域,也可以利用函数作用域arr[i]=function(){ var temp=i; console.log(temp); } }

anet

注意看循环体只是简单的赋值操作而已循环结束,i的值为10,这个时候输出自然为10
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答