zakas大神原书上说:作用域链配置机制有一个副作用-----闭包只能取得包含函数中任何变量的最后一个值,也就是下面函数中result【i】取值都是i的最后一个值10,但是实际结果却不同
function createFunction(){
var result = new Array();
for(var i = 0;i < 10;i++){
result[i] = function(){
return i;
};
}
return result;
}
console.log(createFunction());
运行出来的结果,result返回的是一个函数数组啊,有木有,而且i都没有数值啊,有木有~如果让匿名函数立即执行,result返回的是数组没错,不过结果也不是预想的[10,10,.........,10]啊,而是[0,1,2,3,4.....,9]
function createFunction(){
var result = new Array();
for(var i = 0;i < 10;i++){
result[i] = function(){
return i;
}();
}
return result;
}
console.log(createFunction());
求大神解释不胜感激

解决方案 »

  1.   

    result[i] = function(){
    return i;
    };数组项赋值的就是函数啊,那存储的不是数组是什么。。
    你这个根本就没闭包。就是申明个匿名函数马上执行,就等价于
    result[i] =i;
      

  2.   

    那个大神并没有完全掌握闭包或者作用域链。话说我也没能完全掌握。请看下面的代码function createFunction(){
        var result = new Array();
        for(var i = 0;i < 10;i++){
            result[i] = function(){
                return i;
            };
        }
        //i = 100;//取消注释看看
        return result;
    }var tmp = createFunction();
    for(var i = 0, il = tmp.length; i < il; i++)console.log(tmp[i]());//result的每个元素都是一个函数
    function createFunction(){
        var result = new Array();
        for(var i = 0;i < 10;i++){
            result[i] = function(){
                return i;
            }();
            alert(i + ' ' + result[i]);
        }
        return result;
    }var tmp = createFunction();
    for(var i = 0, il = tmp.length; i < il; i++)console.log(tmp[i]);//result的每个元素都是一个数字
    function createFunction(){
        var result = new Array();
        for(var i = 0;i < 10;i++){
            result[i] = function(x){
                return function(){return x};
            }(i);
        }
        //i = 100;//取消注释看看
        return result;
    }var tmp = createFunction();
    for(var i = 0, il = tmp.length; i < il; i++)console.log(tmp[i]());//result的每个元素都是一个函数请着重对比一下第一块和第三块代码