最近要做一个安卓程序作为实验作业,准备学习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]());

 

分类: 编程