Есть ли способ не вернуть что-то с помощью CoffeeScript?

116

Похоже, CoffeeScript автоматически возвращает последний элемент в области видимости. Могу ли я избежать этой функции?

Shamoon
источник
Зачем тебе это нужно? Разве вы не можете просто отбросить возвращаемое значение, когда захотите?
Крис,
11
@Chris: Когда нет значимого возвращаемого значения, утечка того, что случилось в результате последнего оператора, не является хорошей идеей.
11
@Chris это также может иметь последствия для производительности с циклами computing / for / while, так как coffeescript может собирать результат каждой итерации в массиве, если используется возвращаемое значение цикла (или если это последнее выражение функции)
Арно Ле Блан
1
У меня только что возникла проблема с подрядчиком. Я определил функцию в последней строке конструктора. Так что это было возвращено вместо моей «Класс-Функция». Мне пришлось это явно вернуть. Просто говорю, что это может быть проблемой.
Маркус

Ответы:

150

Вы должны ничего явно не возвращать или оставить выражение, оцениваемое как undefined, внизу вашей функции:

fun = ->
    doSomething()
    return

Или:

fun = ->
    doSomething()
    undefined

Это то, что рекомендует документ при использовании понимания:

Будьте осторожны, чтобы случайно не вернуть результаты понимания в этих случаях, добавив значимое возвращаемое значение - например, true - или null в конец вашей функции .


Однако вы можете написать такую ​​оболочку:

voidFun = (fun) ->
    ->
        fun(arguments...)
        return

(Обратите внимание на оператор splat здесь ( ...))

И используйте это при определении функций:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Или вот так:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Арно Ле Блан
источник
Спасибо за информативный ответ. Мне тоже было интересно об этом, поскольку я сейчас изучаю кофе-скрипт. Мне любопытно, можете ли вы пролить свет на то, что лучше всего или какой худший выбор будет при предотвращении возврата значения? В частности, мне сказали , что варианты добавить либо return, undefinedили nullдо конца моей функции. Однако nullмне почему-то добавление кажется неправильным. Правильно ли я полагаю, что это худший выбор из трех?
Стефмихаил
2
В javascript функция без оператора return (или пустого оператора return) возвращает undefined, поэтому лучше всего либо добавить пустой return, либо оставить undfinedв конце. returnКажется, что использование пустого оператора не лучше выражает return, чем оставление undefinedв конце функции, поэтому пустой returnвариант кажется лучшим вариантом.
Арно Ле Блан
2
Вместо fun(arguments...)этого лучше было бы позвонить fun.apply(this, arguments).
Мигель Мадеро
4
На самом деле «return» и «undefined» генерируют разные javascript. Используя «Попробуйте Coffeescript» на coffeescript.org , можно увидеть, что явное включение «return» в coffeescript удаляет возврат из javascript; тогда как с "undefined" функция javascript заканчивается на "return void 0;"
Daniel
1
Я думаю, вам может потребоваться быть осторожным с voidFun, потому что я подозреваю, что внутренняя функция по-прежнему будет возвращать все, что захочет, что, возможно, может вызвать снижение производительности.
AturSams
10

Да, с returnпоследней строкой функции.

Например,

answer = () ->
  42

extrovert = (question) -> 
  answer()

introvert = (question) ->
  x = answer()
  # contemplate about the answer x
  return 

Если вы хотите увидеть, в какой js компилируется кофе, попробуйте http://bit.ly/1enKdRl . (Я использовал сокращение coffeescript для своего примера)

gprasant
источник
1
Я думаю, что он был отклонен, потому что этот ответ не добавляет никакой ценности, кроме того, который уже есть в ответе с наибольшим количеством голосов, который также был дан за 2 года до этого!
kumarharsh
5

Просто что-нибудь забавное (интересное)

suppressed = _.compose Function.prototype, -> 'do your stuff'

Function.prototypeСама по себе функция всегда ничего не возвращает. Вы можете использовать compose для передачи возвращаемого значения в эту черную дыру, и составленная функция никогда ничего не вернет.

ming_codes
источник
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
yfeldblum
источник
-1

Кажется, что функции в CoffeeScript всегда должны что-то возвращать, даже null. В C у вас есть voidтип возвращаемого значения. ->, пустая функция компилируется в (function() {}), поэтому это единственная функция, которая ничего не возвращает.

L01man
источник
Это не правда. return;работает в C, JavaScript и CoffeeScript, чтобы вернуть пустое значение.
yyny