我被一个未来的客户解决了这个问题而且我无法准时,只有makeSFns
函数可以改变,而且我正在改变以给出特定的平方值来匹配{{ 1}}函数(基于square
中的位置)我不断得到arr
的错误,这很奇怪,因为它被比较的平方函数返回funcs[i] is not a function
,这是怎么回事期望函数匹配一个数字?
number
有人问我是如何得到错误的,我试图找到一种方法来获得//Task: fix makeSFns function to show correct answer
var arr = [ Math.random(), Math.random(), Math.random(), Math.random() ];
var square = function (x) { return x * x; };
function makeSFns(arr, square) {
var fns = [];
for (var i = 0; i < arr.length; i++) {
fns.push(function() {
return square(arr[i]);
});
}
return fns;
}
var funcs = makeSFns(arr, square);
isEqual = true;
for (var i = 0; i < arr.length; i++) {
if (funcs[i]() !== square(arr[i])) {
isEqual = false;
console.log('wrong answer');
break;
}
}
if (isEqual) console.log('correct answer');
中的位置然后返回
arr
答案 0 :(得分:1)
你将arr [i]传递给makeSFns中的square函数但是这个值丢失了,因为它不是真正的闭包。
//Task: fix makeSFns function to show correct answer
var arr = [ Math.random(), Math.random(), Math.random(), Math.random() ];
var square = function (x) { return x * x; };
function makeSFns(arr, square) {
return arr.map((num, i)=>()=>{
return square(arr[i])
});
}
var funcs = makeSFns(arr, square);
isEqual = true;
for (var i = 0; i < arr.length; i++) {
if (funcs[i]() !== square(arr[i])) {
isEqual = false;
console.log('wrong answer');
break;
}
}
if (isEqual) console.log('correct answer');
&#13;
答案 1 :(得分:0)
这是一个经典之作,因为在循环之后调用push
函数,它引用了最后一个已知的i
,它未被正确捕获。
//Task: fix makeSFns function to show correct answer
var arr = [ Math.random(), Math.random(), Math.random(), Math.random() ];
var square = function (x) { return x * x; };
function makeSFns(arr, square) {
var fns = [];
for (var i = 0; i < arr.length; i++) {
(function(n) {
fns.push(function() {
return square(arr[n]);
});
})(i);
}
return fns;
}
var funcs = makeSFns(arr, square);
isEqual = true;
for (var i = 0; i < arr.length; i++) {
if (funcs[i]() !== square(arr[i])) {
isEqual = false;
alert('wrong answer');
break;
}
}
if (isEqual) alert('correct answer');
&#13;
有关此主题的更多信息:
修改:an interesting tranformation done by TypeScript when using the let
keyword:
TS
for (let i = 0; i < arr.length; i++) {
fns.push(function() {
return square(arr[i]);
});
}
JS
var _loop_1 = function (i) {
fns.push(function () {
return square(arr[i]);
});
};
for (var i = 0; i < arr.length; i++) {
_loop_1(i);
}
答案 2 :(得分:0)
这是因为数组的引用不适用于被推入fns数组的函数,这是一个经典的javascript场景。
//Task: fix makeSFns function to show correct answer
//Task: fix makeSFns function to show correct answer
var arr = [ Math.random(), Math.random(), Math.random(), Math.random() ];
var square = function (x) { return x * x; };
function makeSFns(arr, square) {
var fns = [];
for (var i = 0; i < arr.length; i++) {
let myFn = function(myInput) {
return square(myInput);
};
fns.push(myFn.bind(null,arr[i]));
}
return fns;
}
var funcs = makeSFns(arr, square);
isEqual = true;
for (var i = 0; i < arr.length; i++) {
if (funcs[i]() !== square(arr[i])) {
isEqual = false;
console.log('wrong answer');
break;
}
}
if (isEqual) console.log('correct answer');
&#13;
答案 3 :(得分:0)
有一个解决方案,只需更改一个关键字即可:
function makeSFns(arr, square) {
var fns = [];
- for (var i = 0; i < arr.length; i++) {
+ for (let i = 0; i < arr.length; i++) {
fns.push(function() {
return square(arr[i]);
});
}
return fns;
}
使用let
会更改i
的范围,并使其表现得像一个单独的闭包。 for
循环中的每个迭代都将拥有自己的i
实例。