Код, выполненный из атрибутов HTML, выполняется в глобальной области видимости. если вы поместите код внутри
$(document).ready(function() {
...JS code from codepen
});
тогда функции объявляются в области действия этой функции, а не в глобальной области действия.
Нет необходимости помещать определения функций в $(document).ready
. Вам нужно только поместить код, который не должен запускаться, пока не будет загружен DOM. Функции не запускаются до тех пор, пока они не будут вызваны, и этого не произойдет, пока пользователь не нажмет на элементы, что, очевидно, не может произойти до загрузки и отображения DOM.
Тем не менее, ваши функции ссылаются на переменные, которые объявлены в функции $(document).ready
, поэтому вы столкнетесь с другой проблемой, связанной с определением области действия, если переместите функции наружу. Таким образом, решение для этого состоит в том, чтобы сохранить определения функций внутри, но заставить их создавать глобальные имена функций. Изменение
function stopWatch() {
...
}
до
window.stopWatch = function() {
...
};
Другое решение - избавиться от атрибутов onclick
в HTML и использовать привязку событий jQuery.
$("#start").click(startWatch);
$("#reset").click(resetWatch);