Почему этот вызов функции не работает с использованием Coffeescript? - PullRequest
7 голосов
/ 19 декабря 2011

Сейчас я делаю переход к написанию всего моего кода JavaScript с использованием Coffeescript, но я разочарован, потому что самый простой пример вызывает у меня проблемы.На данный момент, я провел более часа исследований, не имея возможности найти ответ на этот вопрос ...

<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js" type="text/javascript" charset="utf-8"></script>
  <link href="sheet.css" rel="stylesheet" type="text/css" media="screen" />
  <script type="text/coffeescript">
    $ ->
      sayHi()

    sayHi = ->
      alert 'Hi there!'
  </script>
</head>    
<body>
  <div id="all">  
  </div>  
</body>
</html>

Как видно из приведенного выше кода, я просто пытаюсьзаставить вызов функции sayHi () работать из обработчика готовности jQuery.Но я получаю следующую ошибку:

Uncaught TypeError: undefined не является функцией

Пожалуйста, помогите мне, в соответствии с компилятором и учебниками, которые япрочитайте это ' должно ' работать, но я не знаю, что я делаю, ужасно неправильно, потому что это не работает: (

Ответы [ 2 ]

11 голосов
/ 19 декабря 2011
Теги

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 на реальном веб-сайте.

Скомпилируйте ваш кофейный скрипт, прежде чем ваш браузер увидит его как ответственного разработчика:)

4 голосов
/ 19 декабря 2011

Переверните утверждения. Похоже, у CoffeeScript есть те же ограничения, что и у старого доброго C, когда вы не можете вызвать функцию / метод, пока она не будет определена в порядке вашего кода.

Так что используйте

<script type="text/coffeescript">
  sayHi = ->
    alert 'Hi there!'

  $ ->
    sayHi()
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...