Javascript:TypeError混淆

Javascript:TypeError混淆,javascript,typeerror,Javascript,Typeerror,我正在学习Javascript,发现理解它令人沮丧 下面是两个函数,它们计算给定数组中的整数之和,其中一个工作,另一个部分工作 以下是我的工作职责: var sum = function(array) { total = 0 for (index in array) { total += array[index] } return total } var sum = function(array)

我正在学习Javascript,发现理解它令人沮丧

下面是两个函数,它们计算给定数组中的整数之和,其中一个工作,另一个部分工作

以下是我的工作职责:

 var sum = function(array) {
        total = 0
        for (index in array) {
          total += array[index]
        }
        return total
    }
 var sum = function(array) {
        sum = 0
        for (index in array) {
          sum += array[index]
        }
        return sum
    }
以下是部分工作功能:

 var sum = function(array) {
        total = 0
        for (index in array) {
          total += array[index]
        }
        return total
    }
 var sum = function(array) {
        sum = 0
        for (index in array) {
          sum += array[index]
        }
        return sum
    }
您将看到差异点是变量名。我想我在这里缺少一些基本的理解,我想澄清一下

以下是我的测试声明:

console.log(sum( [1, 2, 3, 4, 5, 5, 7] ) === 27)
console.log(sum( [1, 2, 3, 4, 5, 5, 7] ) === 27)
它们完全相同,目的是向您展示问题的中心

对于工作函数,它为两个测试语句返回true。
对于部分工作的函数,它返回true一次,后跟
TypeError:number不是函数

这是怎么回事

 var sum = function(array) {
    sum = 0

sum
现在是一个数字,而不是一个函数。

您正在覆盖
sum
变量

var sum = function(array) {
        sum = 0 // <-- doh!
        for (index in array) {
          sum += array[index]
        }
        return sum
    }

…会有用的。仅引用
sum
会导致引擎首先在函数中查找名为
sum
的变量,如果在函数中找不到,它将遍历对象的范围链以找到它。在函数中用
var
声明会告诉引擎这是一个新变量,其作用域仅限于直接父对象,在本例中,函数。

对丢失的
var
的报复。如果这是真的,那么为什么第一个测试语句的测试语句打印为true而不引发错误?@Lambin:因为您还没有将它分配给一个数字。@Lambin,因为第二个sum赋值直到调用函数并完成赋值后才会发生执行。这是一个很好的解释。但我仍然想知道,如果理解
sum
现在是一个
number
,为什么第一个测试语句的结果是真的?@Lambin
sum
在整个过程中都不是一个
number
。最初,它是一个
函数
,因此您可以调用它一次。但是,在第一次调用期间,
函数
被替换为
编号
“通过父对象查找”实际上应该是“在函数中查找名为sum的变量,然后在其作用域链上查找”。