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

#javascript #javascript-framework #coffeescript

#javascript #javascript-фреймворк #coffeescript

Вопрос:

Как написать это в coffeescript?

 f = (function(){
   // something
})();
  

Спасибо за любые советы 🙂

Ответ №1:

Хотя вы можете просто использовать круглые скобки (например, (-> 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 раза.

Комментарии:

1. Вы также можете написать f = do -> console.log x

2. @scribu Ну, эти два утверждения очень разные, и ваше на самом деле то, которое я должен был дать. Мой присваивает функцию -> console.log 'this runs right away' f , затем запускает ее; ваш запускает функцию и затем присваивает ее результат f , как в исходном вопросе. (Хотя в случае console.log возвращаемое значение всегда undefined в любом случае.)

3. Точно. Кроме того, вы можете определить свойства объекта таким образом: {f: do -> // something}

4. Начиная с версии CoffeeScript 1.3.1 (выпущен в апреле 2012), do также позволяет передавать аргументы функции. Чтобы передать 1 и 2 в качестве параметров x и y , напишите do (x = 1, y = 2) -> . (Документация по этой функции затерялась , но проблема, в которой была введена эта функция, содержит несколько примеров.)

Ответ №2:

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

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

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

 (( global, doc ) -> 
  # your code here
)( window, document ) 
  

Комментарии:

1. do (global=window, doc=document) ->

Ответ №3:

в coffee это до смешного просто:

 do ->
  

вернет

 (function() {})();
  

Ответ №4:

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

 do ($ = jQuery) ->
  

Ответ №5:

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

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

Ответ №6:

 do ->
    #your stuff here
  

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

Комментарии:

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

Ответ №7:

Прошу прощения, я решил это:

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

Комментарии:

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

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

Ответ №8:

Это должно быть

 f = () ->
  # do something