1.我们先看一下闭包引起的问题
function test() {
var arr = []
for(var i = 0; i < 10; i++){
arr[i] = function () {
console.log(i + " ")
}
}
return arr
}
var arr = test()
for(var i = 0; i < 10; i++){
arr[i]()
}//输出10个10
2.分析一下造成这种情况的原因:由于arr中的函数执行时test中的i=10,因此他们打印出来的i=10
3.解决方案
a利用立即执行函数
function test() {
var arr = []
for(var i = 0; i < 10; i++){
(function(j){
arr[j] = function () {
console.log(j + " ")
}
}(i)) //立即执行函数
}
return arr
}
var arr = test()
for(var i = 0; i < 10; i++){
arr[i]()
}//输出0,1,2,3,4,5,6,7,8,9
b.es6新特性let块级作用域
function test() {
var arr = []
for(let i = 0; i < 10; i++){ //此处使用let
arr[i] = function () {
console.log(i + " ")
}
}
return arr
}
var arr = test()
for(var i = 0; i < 10; i++){
arr[i]()
}//输出0,1,2,3,4,5,6,7,8,9