Javascript编码挑战

时间:2018-03-12 22:02:18

标签: javascript

我被一个未来的客户解决了这个问题而且我无法准时,只有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

4 个答案:

答案 0 :(得分:1)

你将arr [i]传递给makeSFns中的square函数但是这个值丢失了,因为它不是真正的闭包。

&#13;
&#13;
//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;
&#13;
&#13;

答案 1 :(得分:0)

这是一个经典之作,因为在循环之后调用push函数,它引用了最后一个已知的i,它未被正确捕获。

&#13;
&#13;
//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;
&#13;
&#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场景。

&#13;
&#13;
//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;
&#13;
&#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实例。