Теги
text/coffeescript
имеют ключевое отличие от тегов text/javascript
. Они не «бегут», пока документ не загрузится. Это связано с тем, что библиотека сценариев кофе должна найти все теги сценария кофе и скомпилировать их, и она должна ждать, пока DOM не будет готов, поэтому она может быть уверена, что найдет их все.
Другая проблема заключается в том, что jQuery немедленно запустит обратный вызов готовности DOM, если событие уже произошло. И в этом случае он имеет.
Итак, когда это скомпилировано в JS, вы получите следующее:
var sayHi;
$(function() {
return sayHi();
});
sayHi = function() {
return alert('Hi there!');
};
Итак, что происходит:
- объявляет переменную
sayHi
без значения, делая ее undefined
.
- Создание обратного вызова DOM ready для jQuery, использующего эту переменную.
- jQuery немедленно запускает функцию обратного вызова, поскольку готовность к DOM уже произошла.
- Функция обратного вызова выполняется и пытается запустить
sayHi()
, который все еще не определен.
- После выполнения обратного вызова
sayHi
устанавливается на функцию, которую вы хотите запустить.
Теперь, если бы это был обычный тег JS, он мог бы выполняться до загрузки документа, и тогда он работал бы нормально, потому что к тому времени, когда обратный вызов фактически запустился, тогда sayHi
был бы назначен правильно.
Чтобы исправить это, вы должны назначить функцию ДО того, как вы запустите pass в обратном вызове. Или вы можете полностью пропустить $(->)
, поскольку вы уже знаете, что DOM готов к запуску. Но на самом деле это одна из основных причин, по которой вам не следует использовать теги coffeescript. Это действительно не то же самое, что использование тега JS. И одна из многих причин, почему это не рекомендуемый подход для использования CoffeeScript на реальном веб-сайте.
Скомпилируйте ваш кофейный скрипт, прежде чем ваш браузер увидит его как ответственного разработчика:)