В CoffeeScript как трябва да форматирам извикване на функция, което приема анонимна функция и други аргументи?

Ето един измислен пример, който измислих:

fn = (f, a, b, c)-> alert("#{f() + a + b + c}")

fn((-> "hi"), 1, 2, 3)

Чудя се какъв е предложеният начин за форматиране на последния ред? Този пример е лесен за разбиране, но си представете, ако анонимната функция ((-> "hi")) е многоредова и приема множество аргументи. Този код ще стане много грозен и ще започне да изглежда като шушукане.

fn2 = (f, a, b, c)-> alert("#{f(1, 2) + a + b + c}")

fn2(((a, b) -> 
  c = a + b
  c), 1, 2, 3)

Това може да стане доста неприятно. Има ли някакъв начин да форматирам този код, за да го направя по-четлив или най-добрият съвет е да наименувам анонимната функция?

Забелязвам няколко подобни въпроса, питащи как да направя това. Разликата тук е, че питам как да го форматирам.


person Daniel Kaplan    schedule 08.08.2013    source източник


Отговори (2)


Виждал съм този стил да се използва няколко пъти:

fn2 (a, b) -> 
  a + b
, 1, 2, 3

Например в setTimeout повиквания:

setTimeout ->
  alert '1 second has passed'
, 1000

Но мисля, че като цяло е по-добре да се отдели параметърната функция в променлива:

add = (a, b) -> 
  a + b
fn2 add, 1, 2, 3

Или, ако е възможно да промените дефиницията на функцията, направете параметъра на функцията последен:

fn2 1, 2, 3, (a, b) ->
  a + b
person epidemian    schedule 08.08.2013

В документацията на Coffeescript има пример с последен параметър на функцията

task 'build:parser', 'rebuild the Jison parser', (options) ->
  require 'jison'
  code = require('./lib/grammar').parser.generate()
  dir  = options.output or 'lib'
  fs.writeFile "#{dir}/parser.js", code

Тестовите файлове на Coffeescript имат много примери с последна функция

test "multiple semicolon-separated statements in parentheticals", ->
  nonce = {}
  eq nonce, (1; 2; nonce)
  eq nonce, (-> return (1; 2; nonce))()

Когато функцията не е последна, имате нужда от по-объркани отстъпи и запетаи или допълнителни скоби, за да дефинирате границите на функцията.

person hpaulj    schedule 08.08.2013
comment
Съгласен съм, че в node.js като цяло ще видите функциите за обратно извикване в края, така че е добра практика да свикнете. - person jcollum; 08.08.2013