TypeError:熟练程度不是函数 - 但确实如此

时间:2016-04-27 19:47:39

标签: 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){
    proficiency = 4;
    } else if (level >= 13 && level < 17) {
    proficiency = 5;
    } else if (level >= 17 && level <= 20) {
    proficiency = 6;
    }

    return proficiency;
}

然后我在另一个名为&#34;掷骰子&#34;的功能中运行它。因为它是一个D&amp; D角色生成器,这将反映骰子滚动:

proficiency(level);

我第一次这样做,它运作正常。没有错误。功能相应地发生。第二次我尝试它,它给了我以下错误。

TypeError: proficiency is not a function

每次刷新页面时都会发生这种情况。我在全球宣布这项功能,所以我不知道这种情况会如何发生。

6 个答案:

答案 0 :(得分:1)

您正在使用功能整数INSIDE覆盖您的熟练功能。因此,当您第一次调用proficiency(level)时,它被视为一个函数,但是第二次调用它时,它会被2到6的值覆盖。由于proficiency(level)对整数无效,因此抛出那个错误

答案 1 :(得分:1)

您遇到的问题是闭包之一。您正在使用变量proficiency两次。

首次解析代码时,function proficiency()会被提升到文件的顶部,而变量proficiency就是该函数。

然后,一旦你第一次调用该函数,你就会覆盖它。

function proficiency() {
    proficiency = 2; // Here, no matter which if you're inside.
}

因为您没有使用proficiency关键字在函数顶部声明var,所以它会在外部范围声明,很可能是window。所以下次你去调用你的函数时,proficiency不再是你声明它的函数,而是第一次执行函数时的值。

正如我在撰写此答案时在评论中快速说明的那样,避免这种情况的最简单方法是不要让函数中的变量与函数同名。它还使您的代码更易于阅读。

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;
}

答案 2 :(得分:1)

通过在函数中执行proficiency = X;,您将创建一个名为proficiency的全局变量,它不是函数。您应该使用关键字var

在函数范围内声明它
function proficiency(level) {
    var proficiency;
    if (level >= 1 && level < 5) {
    /* ... */
}

答案 3 :(得分:0)

也许您的函数名称proficiency与您的变量名称proficiency冲突。您可以立即返回值以避免引入另一个变量。

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');
}

答案 4 :(得分:0)

正如MDN所指出的那样:

  

函数声明还会创建一个与其名称相同的变量   功能名称。因此,与函数表达式定义的那些不同,   函数声明定义的函数可以通过它们访问   名称在他们定义的范围内。

因此,在您运行一次函数后,您将有效地破坏该函数。你可以通过在第一次调用函数之前和之后记录console.log(typeof proficiency)来看到这一点。第一次获得function,第二次获得number

解决方案?在函数中使用proficiency以外的变量名。

答案 5 :(得分:0)

我意识到我做错了什么。

是的,我需要将功能(熟练程度)与变量(熟练程度)区分开来。完成。但后来我变得垃圾,直到我意识到我是一个傻瓜。

我需要在掷骰子功能

中创建一个变量
var prof = proficiency(level);

有一次,我在jquery.html声明中打电话给教授,瞧,问题解决了。谢谢你给我指路。