javascript的闭包与变量 本帖最后由 qiugua 于 2011-02-23 16:33:50 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var funcs<---createFunction()--->result--->new Array()=====>result[i]=(function(i){return function(){}})(i);-----i=1--10我看不单单是闭包问题吧 还有其他知识点 还没学透 等同于for (var i=0; i < 10; i++){ result[i] = i; }楼主不必写的那样,要可读性好点,可以拆段写。for (var i=0; i < 10; i++){ result[i] = a(i); }function a(num){ return b(num);}function b(i){ return i;}不知道是否有性能上的异同。还请指点 懂了就不难理解了,关键代码就在:result[i] = function(num){ return function(){ return num; };}(i);这段代码的执行结果相当于:result[0]=function(){return 0;};result[1]=function(){return 1;};...result[9]=function(){return 9;};后面带(i)表示直接执行,i的值传给了参数num,内部函数的局部变量num受闭包影响,所以也等于外面的参数num的值。 这是什么书的内容,对于还没有搞清楚的人来说绝对累死从最里层function(){ return num; };本身返回的num是其外部的那个num;即 function(num){...}传入的,此时的num对于上面的那个方法体是外部变量,所以上面的代码中没有重复的num所以可以获得,然后被返回; function(num){ return function(){ return num; }; }(i)主要的是最后(i)的i,实际上就是这个方法体自执行了一次,情况就如:func = function(num){...};func(i);一样的效果。此时最外层的数组result[i]其实是被定义为一个方法体,情况如result[i] = func;结果是一样的;既然result[i]是一个方法,所以其实就可以好像func那样的调用即func(i); 就是完全等同于 result[i](i);所以createFunctions()被实例的时候,实际就是createFunctions这个方法里面的result进行了10次的赋值操作,所以这个时候result[0]() = func(0) = 0;result[1]() = func(1) = 1;result[2]() = func(2) = 2;result[3]() = func(3) = 3;result[4]() = func(4) = 4;result[5]() = func(5) = 5;result[6]() = func(6) = 6;result[7]() = func(7) = 7;result[8]() = func(8) = 8;result[9]() = func(9) = 9; 究正自己一个问题,内部函数的num跟外面函数的参数应该算同一个参数,而不是“等于外面的参数num的值”。 Extjs 与 struts2 实现 异步加载树的实例 急用啊!!!!!!!!!!! js UBB replace 求submit+onsubmit+action的组合用法。 用JavaScript动态地修改一个input值时的onchange问题 正则表达式求助 这几个坐标值都是什么意思啊? 关于js的类的问题 我写的鼠标双击(onDblClick)事件怎么不响应啊??求助 发布:对付CSDN不能上传的利器 十万火急,关于动态加载CheckBox的阅题? 一个简单的js定时切换选项卡问题 style中的top设置在javascript中不被承认么?
result[i] = i;
}
楼主不必写的那样,要可读性好点,可以拆段写。
for (var i=0; i < 10; i++){
result[i] = a(i);
}
function a(num){
return b(num);
}
function b(i){
return i;
}
不知道是否有性能上的异同。还请指点
result[i] = function(num){
return function(){
return num;
};
}(i);
这段代码的执行结果相当于:
result[0]=function(){return 0;};
result[1]=function(){return 1;};
.
.
.
result[9]=function(){return 9;};
后面带(i)表示直接执行,i的值传给了参数num,内部函数的局部变量num受闭包影响,所以也等于外面的参数num的值。
return num;
};
本身返回的num是其外部的那个num;即 function(num){...}传入的,此时的num对于上面的那个方法体是外部变量,所以上面的代码中没有重复的num所以可以获得,然后被返回; function(num){
return function(){
return num;
};
}(i)主要的是最后(i)的i,实际上就是这个方法体自执行了一次,情况就如:func = function(num){...};
func(i);一样的效果。此时最外层的数组result[i]其实是被定义为一个方法体,情况如
result[i] = func;
结果是一样的;既然result[i]是一个方法,所以其实就可以好像func那样的调用
即
func(i); 就是完全等同于 result[i](i);
所以createFunctions()被实例的时候,实际就是createFunctions这个方法里面的result进行了10次的赋值操作,所以这个时候
result[0]() = func(0) = 0;
result[1]() = func(1) = 1;
result[2]() = func(2) = 2;
result[3]() = func(3) = 3;
result[4]() = func(4) = 4;
result[5]() = func(5) = 5;
result[6]() = func(6) = 6;
result[7]() = func(7) = 7;
result[8]() = func(8) = 8;
result[9]() = func(9) = 9;