Javascript:TypeError混淆
我正在学习Javascript,发现理解它令人沮丧 下面是两个函数,它们计算给定数组中的整数之和,其中一个工作,另一个部分工作 以下是我的工作职责: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)
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
,为什么第一个测试语句的结果是真的?@Lambinsum
在整个过程中都不是一个number
。最初,它是一个函数
,因此您可以调用它一次。但是,在第一次调用期间,函数
被替换为编号
“通过父对象查找”实际上应该是“在函数中查找名为sum的变量,然后在其作用域链上查找”。