范围总和:奇怪的行为

Pat*_*her 2 javascript node.js

Eloquent JavaScript第4章中,我在本章的末尾实现了一个练习,该练习需要编写两个函数:sumrange。我的解决方案工作正常:

console.log(sum(range(1, 10)));

function range(from, to, step = 1) {
    let numbers = [];
    for (let i = from; i <= to; i += step) {
        numbers.push(i);
    }
    return numbers;
}

function sum(numbers) {
    sum = 0;
    for (let x of numbers) {
        sum += x;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我有两次第一行时,出现错误:

console.log(sum(range(1, 10)));
console.log(sum(range(1, 10))); // additional line

function range(from, to, step = 1) {
    let numbers = [];
    for (let i = from; i <= to; i += step) {
        numbers.push(i);
    }
    return numbers;
}

function sum(numbers) {
    sum = 0;
    for (let x of numbers) {
        sum += x;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

使用调用时出现错误消息node sum-of-range.js

/home/paedu/github.com/patrickbucher/eloquent-javascript/exercises/ch04/sum-of-range.js:2
console.log(sum(range(1, 10)));
            ^

TypeError: sum is not a function
    at Object.<anonymous> (/home/paedu/github.com/patrickbucher/eloquent-javascript/exercises/ch04/sum-of-range.js:2:13)
    at Module._compile (internal/modules/cjs/loader.js:936:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
    at Module.load (internal/modules/cjs/loader.js:790:32)
    at Function.Module._load (internal/modules/cjs/loader.js:703:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:999:10)
    at internal/main/run_main_module.js:17:11
Run Code Online (Sandbox Code Playgroud)

Nic*_*ons 5

您的问题是:

function sum(numbers) {
  sum = 0;  // ***
  for (let x of numbers) {
    sum += x;
  }
  return sum;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您要重新分配sum并将其设置为等于变量0。因此,下次您sum()作为函数调用时,它是数字0,因此会给您错误:

TypeError:sum不是函数

要解决此问题,您可以使用关键字将变量声明sum函数 的局部变量:sumlet

function sum(numbers) {
  let sum = 0;  // ***
  ...
}
Run Code Online (Sandbox Code Playgroud)

function sum(numbers) {
  sum = 0;  // ***
  for (let x of numbers) {
    sum += x;
  }
  return sum;
}
Run Code Online (Sandbox Code Playgroud)