我写了一个函数如下
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
每次刷新页面时都会发生这种情况。我在全球宣布这项功能,所以我不知道这种情况会如何发生。
答案 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声明中打电话给教授,瞧,问题解决了。谢谢你给我指路。