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) ->
Билли Мун


5

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

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

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


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

1

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

f = (
    () -> "something"
)()

1
@Squeegy Я бы не стал так говорить. doКлючевое слово имеет некоторые ограничения , которые делают необходимым использовать подход JS-стиль иногда (см выпуск 960 ); doдействительно был добавлен только из-за использования цикла с закрытием.
Trevor Burnham

1
Но мы тоже не используем CoffeeScript, чтобы вот так бить себя по лицу.
Брэндон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.