Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:熟练程度不是一个函数,但它是一个函数_Javascript - Fatal编程技术网

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

解决方案?