В другом месте возник спор по терминологии именованной функции в CoffeeScript. В частности, кто-то упоминал что-то вроде этого:
foo = ->
console.log("bar")
как именованная функция. Но было высказано возражение, что все в CoffeeScript является анонимными функциями и не имеет именованных функций. Это, безусловно, верно, у CoffeeScript есть только функциональные выражения, которые затем можно сохранить в переменной. Но я не думаю, что это означает, что неправильно называть это именованной функцией.
На мой взгляд, это именованная функция, потому что ей присвоено имя. Правда, это не именованная функция так же, как некоторые другие языки имеют именованные функции, но я думаю, что она достаточно близка, чтобы не называть ее именованной функцией. Настаивать на другом просто кажется придиркой.
Могу ли я пойти на ланч, думая, что настаивать на том, что это не именованная функция, просто придираться?
источник
foo = ->
это просто старая функция, аclass Foo
конструктор. Я не вижу причин, почемуfoo = ->
следует строго называть их анонимными.Ответы:
CoffeeScript неумолимо связан с JavaScript, и JavaScript различает следующие выражения:
На самом деле, вы даже можете написать:
Поскольку это различие имеет значение в JavaScript, имеет смысл использовать те же термины, когда речь идет о CoffeeScript. Однако CoffeeScript не поддерживает ничего подобного
function foo ()
синтаксису, поэтому мы можем сказать, что он не имеет «именованных» функций.В некотором смысле имя является частью определения функции в
function foo() { ... }
, где в другом случае вы просто создаете функцию и присваиваете ее переменной. Это отражено, например, в (нестандартном)name
свойстве функций: в первом случаеfoo.name
это даст вам,"foo"
а во втором это даст вам""
.Кроме того, в JavaScript они также различаются с точки зрения того, как они вводятся в область действия: первая версия «поднята» и доступна во всей области ее действия, где второе определение доступно только после ее назначения.
По сути, просто думайте об этом как о специфичном для JavaScript жаргоне, который переносится в CoffeeScript, потому что CoffeeScript так тесно связан с JS.
источник
function foo () {}
. Тем не менее, вы все равно можете инициализировать именованную функцию черезclass
конструкцию. Просто скомпилированный CoffeeScript (получившийся в результате JavaScript) гораздо более многословен, чем большинство написало бы именованную функцию.foo
тело вашей функции не будет поднято.class foo
тело вашей функции не будет перемещено в верхнюю часть файла.Стоит отметить, что пользователь явно заявил, что превращает «анонимную функцию в именованную функцию», причем оба термина имеют сильное существующее значение и заметно отличающиеся функции в мире JavaScript. Учитывая существующее значение, они не делали такой вещи, и я указал на это.
CoffeeScript не так далек от JavaScript, что вам следует переопределить термины, которые они оба разделяют, чтобы означать что-то еще на одном языке. CoffeeScript не существует в каком-то пузыре, удаленном из его реализации JavaScript, как вы могли бы утверждать, что C ++ отделен от Assembly. Знание разницы между анонимной функцией и именованной функцией имеет значение , потому что, если вы ожидаете, что ваша «именованная» функция CoffeeScript будет вести себя как фактическая именованная функция, вы будете разочарованы:
Эквивалентный JavaScript будет хорошо работать с реальной именованной функцией:
Вы можете быть правы, что я просто придираюсь, ну и что? Тонкие моменты в компьютерном программировании имеют значение , и важно быть «технически» правильным. Это разница между написанием кода, который работает, и фактическим пониманием того, почему ваш код корректен .
источник
Нет. В конце концов, с точки зрения семантики, ваша ссылка на функцию хранится в переменной, к которой вы можете обращаться через имя переменной .
источник
Определенно не придурок, имо. Я использую это широко для удобства чтения:
Таким образом:
Реальная именованная функция в "coffeescript"
Вы избегаете чистого JS через обратную черту
Обратите внимание, что вы не можете сделать отступ в своем теле функции.
ура
источник
Не тратьте время на споры с педантами. Это никогда не плодотворно. Да, все знают, что вы подразумеваете под «именованной функцией» в CoffeeScript, даже если она технически неверна. Нет, использование технически неверной, но широко понятой терминологии не имеет отношения к правильности или неправильности предложенного решения. Можно ли быть более точным, не получая некоторую неловкость формулировки? Возможно нет. Однако это не означает, что люди позволят этому скользить. Просто представьте этого парня на другом конце разговора.
Технически неверная причина в том, что вы не назвали функцию, вы назвали ссылку на функцию. Рассматривать:
Как называется функция?
foo
иbar
оба ссылаются на одну и ту же функцию, но имеют разные имена. Кроме того , либо ,foo
илиbar
может быть переведен в любое время , чтобы ссылаться на другую функцию, или даже другой тип в целом, не меняя саму функцию.источник
Итак, как я читаю это так:
Когда вы объявляете функцию в консоли JavaScript, используя
а затем вызвать
foo
без скобок, он возвращаетОднако, если вы определите это с помощью
и затем вызвать
foo
снова без скобок, он возвращаетВ первом случае я бы сказал, что вы объявляете переменную с именем "foo", в которой хранится анонимная функция. Во втором случае я бы сказал, что вы на самом деле объявляете именованную функцию с именем "foo".
Поскольку CoffeeScript использует первый шаблон, я согласен, что технически правильно, что функции CoffeeScript - это все анонимные функции, хранящиеся в именованных переменных.
источник