最近要做一个安卓程序作为实验作业,准备学习ECMAScript 6,又回头看了看ES5中的闭包。
下面用一个例子来说明,我们希望createFunction函数返回一个函数数组,函数分别返回1-10:
function createFunction(){
var result = [] ;
for(var i = 0 ; i < 10 ; ++i){
result[i] = function(){return i;}
}
return result ;
}
var fns = createFunction() ;
console.log(fns[3]());
该代码的运行结果是10,原因是闭包所保存的i是同一个变量,当for循环执行完成后i的就是10。在ES6之前,我们是这样解决这一问题的:
function createFunction(){
var result = [] ;
for(var i = 0 ; i < 10 ; ++i){
result[i] = (function(num){
return function(){
return num ;
}
})(i);
}
return result ;
}
var fns = createFunction() ;
console.log(fns[3]());
可以看到,这样的代码显得比较复杂,我们使用ES6的let关键字:
function createFunction(){
var result = [] ;
for(let i = 0 ; i < 10 ; ++i){
result[i] = function(){return i;}
}
return result ;
}
var fns = createFunction() ;
console.log(fns[3]());
同样的,上面代码也解决了问题,但是简单了许多,原因是每次循环是i都是一个新的变量。
进一步的,for-in循环和for-of循环也类似:
function cf(obj){
var result = [] ;
for(let t in obj) {
result.push(function(){
return t ;
})
}
return result;
}
var obj = {a:1,b:2};
var fns = cf(obj);
console.log(fns[0]());