闭包问题求助

wangyinshu 2013-01-10 09:56:21
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());
求大神解释。。。不胜感激
...全文
174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyinshu 2013-01-10
  • 打赏
  • 举报
回复
引用 3 楼 likeajin 的回复:
那个大神并没有完全掌握闭包或者作用域链。话说我也没能完全掌握。请看下面的代码 JavaScript code?12345678910111213function createFunction(){ var result = new Array(); for(var i = 0;i < 10;i++){ result[i] = function(……
非常感谢,是我理解的问题
likeajin 2013-01-10
  • 打赏
  • 举报
回复
那个大神并没有完全掌握闭包或者作用域链。话说我也没能完全掌握。请看下面的代码

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的每个元素都是一个函数
请着重对比一下第一块和第三块代码
wangyinshu 2013-01-10
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
result[i] = function(){ return i; }; 数组项赋值的就是函数啊,那存储的不是数组是什么。。 你这个根本就没闭包。就是申明个匿名函数马上执行,就等价于 result[i] =i;
但里面的i为什么是没有赋值的啊,不应该是10么
Go 旅城通票 2013-01-10
  • 打赏
  • 举报
回复
result[i] = function(){ return i; }; 数组项赋值的就是函数啊,那存储的不是数组是什么。。 你这个根本就没闭包。就是申明个匿名函数马上执行,就等价于 result[i] =i;

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧