我是Java语言的初学者,请阅读“面向Web开发人员的JS”一书中的Closures和Variables部分。它给出了两个示例:
function Func1() {
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function() {
console.log('i:'+i);
return i;
};
}
return result;
}
console.log(Func1());
function Func2() {
var result = new Array();
for(var i=0; i < 10; i++){
result[i] = function(num) {
return function() {
console.log('num:'+num);
return num;
};
}(i);
}
return result;
}
console.log(Func2());
在本书的描述中,它在func1中表示,每个函数可以返回10,而在func2中,每个函数将返回不同的数字。但是当我运行代码时,它实际上返回:
[ [Function],
[Function],
[Function],
[Function],
[Function],
[Function],
[Function],
[Function],
[Function],
[Function] ]
两个功能。
那么如何为每个功能打印出实际值?以及为什么选择“ console.log('i:'+ i);”没有在第一个功能中打印?
答案 0 :(得分:2)
尝试将结果[i]数据包装到调用的函数中以获取所需的数据...
检查此:
function Func1() {
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = (function() {
console.log('i:'+i);
return i;
})();
}
return result;
}
console.log(Func1());
答案 1 :(得分:1)
您要在for循环中返回一个函数,而应该只在闭包内部返回该值。
function Func2() {
var result = new Array();
for(var i=0; i < 10; i++){
result[i] = function(num) {
console.log('num:'+num);
return num;
}(i);
}
return result;
}
console.log(Func2());
答案 2 :(得分:1)
给出函数执行的当前输出,即函数Array
,可以迭代FuncN
的结果,然后在数组的每个元素上执行函数
for (let n = 0, f = Func1(); n < f.length; n++) {
console.log(f[n]())
}
答案 3 :(得分:1)
像这样尝试它们:
function Func1() {
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function() {
console.log('i:'+i);
return i;
}();
}
return result;
}
console.log(Func1());
function Func2() {
var result = new Array();
for(var i=0; i < 10; i++){
result[i] = function(num) {
return function() {
console.log('num:'+num);
return num;
}();
}(i);
}
return result;
}
console.log(Func2());
问题是由于您已将函数设置为返回值,而不是先调用函数然后返回。