Аргументы по умолчанию CoffeeScript

Я смотрю на следующий пример из CoffeeScript: Accelerated Development

x = true
showAnswer = (x = x) ->
 console.log if x then 'It works!' else 'Nope.'

console.log "showAnswer()", showAnswer()
console.log "showAnswer(true)", showAnswer(true)
console.log "showAnswer(false)", showAnswer(false)

Я не понимаю, почему showAnswer(...) undefined отображается для каждого теста.

Nope.
showAnswer() undefined
It works!
showAnswer(true) undefined
Nope.
showAnswer(false) undefined

Пожалуйста, объясните вывод каждого случая.

1 ответ

Не забывайте, что CoffeeScript по умолчанию возвращает последний оператор в функции. Итак, что на самом деле говорит ваша функция showAnswer:

showAnswer = (x = x) ->
 return console.log if x then 'It works!' else 'Nope.'

или скомпилирован в JavaScript:

showAnswer = function(x) {
 if (x == null) {
 x = x;
 }
 return console.log(x ? 'It works!' : 'Nope.');
};

Другое дело, что метод console.log возвращает undefined. Поэтому, когда вы регистрируете результат вашего метода showAnswer, он будет печатать undefined.

Если я правильно понял ваше намерение, я бы изменил вашу оригинальную функцию, чтобы сделать это:

showAnswer = (x = x) ->
 if x then 'It works!' else 'Nope.'

Кроме того, измените свои console.log заявления как таковые:

console.log "showAnswer()"
showAnswer()

console.log "showAnswer(true)"
showAnswer(true)

console.log "showAnswer(false)"
showAnswer(false)

licensed under cc by-sa 3.0 with attribution.