2016-04-27 4 views
0

Я написал функцию следующим образомTypeError: знание не является функцией - но это

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

Затем я запускаю его в другой функции, называемой «Ролл кости», как это D & D Character Generator и это отразится на прокатке костей:

proficiency(level); 

В первый раз, когда я это делаю, он отлично работает. Нет ошибок. Функция выполняется соответственно. ВТОРОЕ время, когда я пытаюсь это сделать, это дает мне следующую ошибку.

TypeError: proficiency is not a function 

Это происходит каждый раз, когда я обновляю страницу. Я объявляю эту функцию глобально, поэтому я не знаю, как это происходит.

+1

Не используйте имя функции как имя переменной – j08691

ответ

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

Вы переписываете свою профессиональную функцию с целым числом умения ВНУТРИ функции. Таким образом, в первый раз, когда вы вызываете proficiency(level), он рассматривается как функция, но во второй раз, когда вы его вызываете, он перезаписывается со значением от 2 до 6. Так как proficiency(level) недопустим для целых чисел, он выдает эту ошибку

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

Я пробовал приведенный выше код, и я понимаю, что я запускаю переменную дважды. Теперь то, что я получаю как продукт, а не «4 Proficiency», я получаю всю функцию, написанную на экране. 'умение функционировать (уровень) {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; } Proficiency ' – user3605374

+0

Я не понимаю, что вы имеете в виду о том, что вы получаете в результате, в сравнении с тем, что вы ожидаете. К сожалению, они не форматируют код в комментариях. – krillgar

0

Как MDN указывает:

A function declaration also creates a variable with the same name as the function name. Thus, unlike those defined by function expressions, functions defined by function declarations can be accessed by their name in the scope they were defined in.

Так после запуска функции один раз, вы эффективно уничтожить функцию. Вы можете это увидеть, зарегистрировав console.log(typeof proficiency) до и после вызова функции в первый раз. В первый раз вы получите function, во второй раз вы получите number.

Решение? Используйте имя переменной, отличную от proficiency, внутри функции.

1

Выполняя функцию proficiency = X; в своей функции, вы создаете глобальную переменную с именем proficiency, которая не является функцией. Вы должны объявить его в области видимости функции, используя ключевое слово var:

function proficiency(level) { 
    var proficiency; 
    if (level >= 1 && level < 5) { 
    /* ... */ 
} 
0

я понял, что я делаю неправильно.

Да, мне нужно было отличить функцию (владение) от переменной (владение). Готово. Но потом я получал мусор, пока не понял, что я толпа.

мне нужно создать переменную в рулоне кости функционировать

var prof = proficiency(level); 

После того, как я сделал это, я назвал проф в заявлении jquery.html и вуаля, проблема решена. Спасибо, что показал мне дорогу.