[英]Why is it saying that calcAverage is not a function, when it is
我创建了一个简单的 function 来计算 3 个数字的平均值:
let calcAverage = (v1,v2,v3) =>{
calcAverage = v1+v2+v3 / 3;
return calcAverage
}
const d1 = calcAverage(44, 23,71)
const k1 = calcAverage(44, 23,71)
console.log(d1)
如果你注释掉: const k1 = calcAverage(44, 23,71)
那么你会注意到const d1 = calcAverage(44, 23,71)
有效,但为什么它说'Uncaught TypeError: calcAverage is not a function for这行代码: const k1 = calcAverage(44, 23,71)
? 这对我来说没有任何意义。 我如何使它们都起作用? 为什么它甚至说 calcAverage 不是 function 我首先?
因为您在这一行中重新分配calcAverage
calcAverage = v1+v2+v3 / 3;
这使得calcAverage
成为一个number
而不是 function
你为什么不立即返回这个计算
return v1+v2+v3 / 3;
第一次调用calcAverage
时,它确实是一个 function。但是,您在 function 本身内将其覆盖为一个number
:
calcAverage = v1+v2+v3 / 3;
只需更改 function 中的变量名称即可使其按预期工作:
const calcAverage = (v1,v2,v3) =>{
const result = v1+v2+v3 / 3;
return result;
}
const d1 = calcAverage(44, 23,71);
const k1 = calcAverage(44, 23,71);
console.log(d1);
更新:
要清楚地看到问题,您可以注销每个 function 调用的calcAverage
类型:
let calcAverage = (v1,v2,v3) =>{ calcAverage = v1+v2+v3 / 3; return calcAverage; } console.log("Type before first call: ", typeof calcAverage); const d1 = calcAverage(44, 23,71); console.log("Type before second call: ", typeof calcAverage); const k1 = calcAverage(44, 23,71);
顺便说一下,这很好地展示了使用const
相对于使用let
作为实际常量的优势。 如果您将calcAverage
声明为const
,则不会遇到此问题。
我在 function 中发现了一个与 function 名称相同的变量。 因此,当您第二次调用 calAverage 时,它不是 function,而是某种计算的结果。 我还把 function 作为常数
const calcAverage = (v1, v2, v3) => { let calcAverageVal = v1 + v2 + v3 / 3 return calcAverageVal } const d1 = calcAverage(44, 23, 71) const k1 = calcAverage(44, 23, 71) console.log(d1)
此问题的解决方案是使用不同的变量名来保存 calcAverage 箭头 function 内的计算值。
let calcAverage = (v1,v2,v3) =>{
let calcValue = (v1+v2+v3) / 3;
// it is recommended you bracket your numerator so as not to confuse the calcuation
// because leaving it as v1+v2+v3 / 3 will solve the maths as v1+v2+(v3/3)
return calcValue;
}
const d1 = calcAverage(44, 23,71);
const k1 = calcAverage(44, 23,71);
console.log(d1)
至于我,我确实建议你在声明箭头 function 时使用const
。它有助于使 function 不可操作
都是关于 scope 的依赖
calcAverage
定义为 function => 在第一次通话时:它是一个 function
=> 在第二次通话时:它不再是 function(它是一个数字)
您想随时避免此类问题,您必须始终声明所有变量
并且还建议初学者在严格模式下编写代码('use strict'; directive),这可以帮助你避免这种错误
示例代码:
'use strict'; // on first line, for all the code let calcAverage = (v1, v2, v3) => { let calcAverage = v1 + v2 + v3 / 3; // define a 'new' locale variable //╙╨╨─────────────────────────────────// within the scope of this function return calcAverage } const d1 = calcAverage(44, 23, 71) const k1 = calcAverage(40, 23, 71) console.log(d1) // 90.666... console.log(k1) // 86.666...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.