Подтвердить что ты не робот

Как использовать setTimeout() в Coffeescript

Я не могу использовать setTimeout() для вызова одной из моих собственных функций. Я могу использовать setTimeout для вызова alert(), но не функцию, которую я написал сам. Вот простейший код, который воспроизводит проблему:

У меня есть следующий coffeeScript

    setTimeout(run, 1000)

    run = () ->
        console.log("run was called!")

Что генерирует следующий Javascript

    // Generated by CoffeeScript 1.6.3
    (function() {
      var run;

      setTimeout(run, 1000);

      run = function() {
        return console.log("run was called!");
      };

    }).call(this);

На консоль ничего не печатается.

4b9b3361

Ответ 1

run = () ->
    console.log("run was called!")
setTimeout(run, 1000)

Вы полагаетесь на javascript function hoisting для функций, объявленных с синтаксисом function run(){}, но coffeescript объявляет их как переменные: var run = function(){}, поэтому вам нужно определить перед тем, как вы ссылаетесь на него, в противном случае он все равно undefined, когда вы передадите его на setTimeout.

Ответ 2

Анонимный вариант:

Питер точно прав. Но вы также можете использовать setTimeout без объявления переменной:
setTimeout ->
    console.log 'run was called!'
, 1000

Урожайность:

(function() {
    setTimeout(function() {
        return console.log("run was called!")
    }, 1e3)
}).call(this);