Coffeescript - Как создать самозапускающуюся анонимную функцию?

Ответы:

160

Хотя вы можете просто использовать круглые скобки (например (-> foo)(), вы можете избежать их, используя doключевое слово:

do f = -> console.log 'this runs right away'

Чаще всего используется doзахват переменных в цикле. Например,

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

Без него doвы просто печатали бы значение xпосле цикла 3 раза.

Тревор Бернхэм
источник
24
Вы также можете написатьf = do -> console.log x
scribu 07
5
@scribu Ну, эти два утверждения очень разные, и именно ваше я должен был сказать. Mine присваивает функцию -> console.log 'this runs right away'к f, а затем запускает его; yours запускает функцию, а затем присваивает ее результат f, как в исходном вопросе. (Хотя в случае console.log, возвращаемое значение всегда будет undefined.)
Тревор Бернхэм,
1
В яблочко. Кроме того, вы можете определить свойства объекта следующим образом:{f: do -> // something}
scribu
2
Начиная с CoffeeScript 1.3.1 (выпущенного в апреле 2012 г.), doтакже позволяет передавать аргументы функции. Передавать 1и 2в качестве параметров xи y, писать do (x = 1, y = 2) ->. (Документация по этой функции утеряна , но проблема, в которой эта функция была представлена, содержит несколько примеров.)
Рори О'Кейн
19

Если вы хотите присвоить псевдониму аргументы, передаваемые в функцию самозапуска в CoffeeScript, и скажем, это то, чего вы пытаетесь достичь:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

Тогда do (window, document) ->не позволю тебе этого сделать. Тогда путь к паренсу:

(( global, doc ) -> 
  # your code here
)( window, document ) 
Миша Рейзлин
источник
5
do (global=window, doc=document) ->
Билли Мун
16

в кофе смешно просто:

do ->

вернется

(function() {})();
mart7ini
источник
5

Вы также можете комбинировать doключевое слово с параметрами функции по умолчанию, чтобы заполнить рекурсивные «самозапускающиеся функции» начальным значением. Пример:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000
XåpplI'-I0llwlg'I -
источник
5

попробуй использовать

do ($ = jQuery) ->
Павел Благодов
источник
3
do ->
    #your stuff here

Это создаст самоисполняющееся закрытие, которое полезно для определения области видимости.

Джордан Чекман
источник
1
Похоже, что это не добавляет много новой информации по сравнению с другими уже опубликованными ответами. Вместо того, чтобы создавать конкурирующий ответ, вы можете повысить ценность, разместив информативный комментарий под другим ответом, который добавляет некоторую ясность или полезную информацию к другому ответу.
still_dreaming_1 05
1

Извините, я решил это:

f = (
    () -> "something"
)()
user537339
источник
1
@Squeegy Я бы не стал так говорить. doКлючевое слово имеет некоторые ограничения , которые делают необходимым использовать подход JS-стиль иногда (см выпуск 960 ); doдействительно был добавлен только из-за использования цикла с закрытием.
Trevor Burnham
1
Но мы тоже не используем CoffeeScript, чтобы вот так бить себя по лицу.
Брэндон
0

Должен быть

f = () ->
  # do something
Алонгкорн Четасумон
источник