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

5
@scribu Ну, ці два твердження дуже різні, і твоє насправді саме те, що я мав би дати. Mine привласнює функцію -> console.log 'this runs right away'до f, а потім запускає його; ваш запускає функцію, а потім присвоює її результат 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) ->не дозволите вам цього зробити. Тоді шлях буде за допомогою parens:

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

5
do (global=window, doc=document) ->
Біллі Мун

16

це смішно легко в каві:

do ->

повернеться

(function() {})();

5

Ви також можете поєднати doключове слово з параметрами функції за замовчуванням для насіння рекурсивних "самоініціюючих функцій" з початковим значенням. Приклад:

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


3
do ->
    #your stuff here

Це створить самозапуск, що корисно для масштабування.


1
Здається, це не додає багато нової інформації порівняно з іншими вже опублікованими відповідями. Замість того, щоб створювати конкуруючу відповідь, ви можете додати більше цінності, розмістивши інформативний коментар під іншою відповіддю, яка додає певної ясності або корисної інформації до іншої відповіді.
still_dreaming_1

1

Перепрошую, я це вирішив:

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

1
@Squeegy Я б не обов'язково так казав. doКлючове слово має деякі обмеження , які роблять необхідним використовувати підхід JS-стиль іноді (див випуск 960 ); doнасправді було додано лише через випадок використання циклу із закриттями.
Тревор Бернем

1
Але ми не використовуємо CoffeeScript, щоб вдарити себе так у обличчя.
Брендон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.