Javascript TypeError:熟练程度不是一个函数,但它是一个函数
我写了一个函数如下Javascript TypeError:熟练程度不是一个函数,但它是一个函数,javascript,Javascript,我写了一个函数如下 function proficiency(level) { if (level >= 1 && level < 5) { proficiency = 2; } else if (level >= 5 && level < 9) { proficiency = 3; } else if (level >= 9 && level < 13){ pro
function proficiency(level) {
if (level >= 1 && level < 5) {
proficiency = 2;
} else if (level >= 5 && level < 9) {
proficiency = 3;
} else if (level >= 9 && level < 13){
proficiency = 4;
} else if (level >= 13 && level < 17) {
proficiency = 5;
} else if (level >= 17 && level <= 20) {
proficiency = 6;
}
return proficiency;
}
我第一次这样做,效果很好。没有错误。函数将相应地发生。第二次尝试时,它给出了以下错误
TypeError: proficiency is not a function
每次我刷新页面时都会发生这种情况。我正在全局声明函数,因此我不知道这是如何继续发生的。可能您的函数名
熟练程度
与变量名熟练程度
冲突。您可以立即返回该值,以避免引入另一个变量
function proficiency(level) {
if (level >= 1 && level < 5) {
return 2;
} else if (level >= 5 && level < 9) {
return 3;
} else if (level >= 9 && level < 13){
return 4;
} else if (level >= 13 && level < 17) {
return 5;
} else if (level >= 17 && level <= 20) {
return 6;
}
throw new Error('Invalid character level');
}
功能熟练程度(等级){
如果(级别>=1和级别<5){
返回2;
}否则如果(级别>=5和级别<9){
返回3;
}否则如果(级别>=9和级别<13){
返回4;
}否则,如果(级别>=13和级别<17){
返回5;
}否则,如果(level>=17&&level可能您的函数名熟练程度
与变量名熟练程度
冲突。您可以立即返回该值,以避免引入另一个变量
function proficiency(level) {
if (level >= 1 && level < 5) {
return 2;
} else if (level >= 5 && level < 9) {
return 3;
} else if (level >= 9 && level < 13){
return 4;
} else if (level >= 13 && level < 17) {
return 5;
} else if (level >= 17 && level <= 20) {
return 6;
}
throw new Error('Invalid character level');
}
功能熟练程度(等级){
如果(级别>=1和级别<5){
返回2;
}否则如果(级别>=5和级别<9){
返回3;
}否则如果(级别>=9和级别<13){
返回4;
}否则,如果(级别>=13和级别<17){
返回5;
}否则,如果(level>=17&&level您将使用函数中的熟练度整数覆盖熟练度函数。因此,第一次调用熟练度(level)
,它将被视为一个函数,但第二次调用时,它将被2到6的值覆盖。因为熟练度(level)
对于整数无效,它会引发错误您正在使用函数中的熟练程度整数覆盖熟练程度函数。因此,第一次调用熟练程度(级别)
时,它被视为一个函数,但第二次调用时,它会被2到6之间的值覆盖。因为熟练程度(级别)
对于整数无效,它会引发错误您遇到的问题是闭包之一。您使用变量熟练程度
两次
第一次解析代码时,函数熟练程度()
被提升到文件的顶部,变量熟练程度
就是该函数
一旦你第一次调用这个函数,你就会覆盖它
function proficiency() {
proficiency = 2; // Here, no matter which if you're inside.
}
因为您没有在函数顶部用var
关键字声明experience
,它随后会在外部范围声明,很可能是窗口
。因此下次调用函数时,experience
不再是您声明为的函数,而是第一次调用时的值执行了一项命令
正如我在写这个答案时在评论中所说的那样,避免这种情况的最简单方法是不要让函数中的变量与函数同名。这也使代码更易于阅读
function proficiency(level) {
var result;
if (level >= 1 && level < 5) {
result = 2;
} else if (level >= 5 && level < 9) {
result= 3;
} else if (level >= 9 && level < 13){
result= 4;
} else if (level >= 13 && level < 17) {
result= 5;
} else if (level >= 17 && level <= 20) {
result= 6;
}
return result;
}
功能熟练程度(等级){
var结果;
如果(级别>=1和级别<5){
结果=2;
}否则如果(级别>=5和级别<9){
结果=3;
}否则如果(级别>=9和级别<13){
结果=4;
}否则,如果(级别>=13和级别<17){
结果=5;
}否则,如果(level>=17&&level您遇到的问题是闭包问题。您使用变量熟练程度
两次
第一次解析代码时,函数熟练程度()
被提升到文件的顶部,变量熟练程度
就是该函数
一旦你第一次调用这个函数,你就会覆盖它
function proficiency() {
proficiency = 2; // Here, no matter which if you're inside.
}
因为您没有在函数顶部用var
关键字声明experience
,它随后会在外部范围声明,很可能是窗口
。因此下次调用函数时,experience
不再是您声明为的函数,而是第一次调用时的值执行了一项命令
正如我在写这个答案时在评论中所说的那样,避免这种情况的最简单方法是不要让函数中的变量与函数同名。这也使代码更易于阅读
function proficiency(level) {
var result;
if (level >= 1 && level < 5) {
result = 2;
} else if (level >= 5 && level < 9) {
result= 3;
} else if (level >= 9 && level < 13){
result= 4;
} else if (level >= 13 && level < 17) {
result= 5;
} else if (level >= 17 && level <= 20) {
result= 6;
}
return result;
}
功能熟练程度(等级){
var结果;
如果(级别>=1和级别<5){
结果=2;
}否则如果(级别>=5和级别<9){
结果=3;
}否则如果(级别>=9和级别<13){
结果=4;
}否则,如果(级别>=13和级别<17){
结果=5;
}否则,如果(级别>=17&&level如所述:
函数声明还会创建一个与
函数名。因此,与函数表达式定义的名称不同,
由函数声明定义的函数可以通过其
在定义它们的范围中指定名称
因此,在您运行函数一次之后,您可以有效地销毁函数。您可以通过在第一次调用函数之前和之后记录console.log(熟练程度类型)
来看到这一点。第一次您将获得function
,第二次您将获得number
解决方案?在函数中使用除熟练程度
以外的变量名。如前所述:
函数声明还会创建一个与
函数名。因此,与函数表达式定义的名称不同,
由函数声明定义的函数可以通过其
在定义它们的范围中指定名称
因此,在您运行函数一次之后,您可以有效地销毁函数。您可以通过在第一次调用函数之前和之后记录console.log(熟练程度类型)
来看到这一点。第一次您将获得function
,第二次您将获得number
解决方案?