Ailleurs , un argument a surgi sur la terminologie d'une fonction nommée dans CoffeeScript. En particulier, quelqu'un a fait référence à quelque chose comme ceci:
foo = ->
console.log("bar")
comme fonction nommée. Mais son objecté que tout dans CoffeeScript est des fonctions anonymes et il n'y a pas de fonctions nommées. C'est certainement vrai, CoffeeScript n'a que des expressions de fonction qui peuvent ensuite être stockées dans une variable. Mais je ne pense pas que cela signifie qu'il est faux d'appeler cela une fonction nommée.
Selon moi, c'est une fonction nommée parce que c'est une fonction qui a reçu un nom. Certes, ce n'est pas une fonction nommée de la même manière que certains autres langages ont des fonctions nommées, mais je pense que c'est assez proche pour qu'il ne soit pas inapproprié de l'appeler une fonction nommée. Insister autrement semble juste être une tergiversation.
Suis-je en train de déjeuner en pensant qu'insister sur le fait que ce n'est pas une fonction nommée est juste une piqûre?
la source
foo = ->
est juste une ancienne fonction, tout enclass Foo
étant un constructeur. Je ne vois aucune raison defoo = ->
parler strictement d'anonyme.Réponses:
CoffeeScript est inexorablement lié à JavaScript et JavaScript différencie les expressions suivantes:
En fait, vous pouvez même écrire:
Étant donné que cette différence est importante en JavaScript, il est logique d'utiliser les mêmes termes lorsque vous parlez de CoffeeScript. Cependant, CoffeeScript ne prend rien en charge comme la
function foo ()
syntaxe, nous pouvons donc dire qu'il n'a pas de fonctions "nommées".Dans un sens, le nom fait partie de la définition de fonction dans le
function foo() { ... }
, où dans l'autre cas, vous créez simplement une fonction et l'assignez à une variable. Cela se reflète, par exemple, dans laname
propriété (non standard) des fonctions: dans le premier cas,foo.name
vous donnera"foo"
et dans le second, il vous donnera""
.De plus, en JavaScript, ceux-ci diffèrent également par la façon dont ils sont introduits dans la portée: la première version est "hissée" et disponible dans toute sa portée où la deuxième définition n'est disponible qu'après son affectation.
Fondamentalement, considérez-le comme un jargon spécifique à JavaScript, qui est transféré à CoffeeScript car CoffeeScript est si étroitement lié à JS.
la source
function foo () {}
. Cependant, vous pouvez toujours initialiser une fonction nommée via laclass
construction. Juste que le CoffeeScript compilé (le JavaScript résultant) est beaucoup plus détaillé que la plupart des gens écrivent une fonction nommée.foo
le corps de votre fonction ne sera pas hissé.class foo
fonction ne sera pas hissé en haut du fichier.Il convient de noter que l'utilisateur a explicitement déclaré qu'il transformait une "fonction anonyme en une fonction nommée", les deux termes ayant une signification forte et existante et notamment des fonctionnalités différentes dans le monde JavaScript. Étant donné le sens existant, ils ne faisaient rien de tel, et je l'ai souligné.
CoffeeScript n'est pas si éloigné de JavaScript que vous devriez redéfinir les termes qu'ils partagent pour signifier autre chose dans une langue. CoffeeScript n'existe pas dans certaines bulles, supprimé de son implémentation JavaScript de la façon dont vous pourriez affirmer que C ++ est séparé de Assembly. Connaître la différence entre une fonction anonyme et une fonction nommée questions , parce que si vous attendez votre « nommé » fonction CoffeeScript à se comporter comme une réelle fonction nommée, vous allez être déçu:
Le JavaScript équivalent fonctionnerait bien, avec une vraie fonction nommée:
Vous avez peut-être raison de dire que je ne fais que "taquiner", mais alors quoi? Les points subtils en matière de programmation informatique et le fait d'être "techniquement" correct sont importants. C'est la différence entre écrire du code qui fonctionne et comprendre pourquoi votre code est correct .
la source
Non . Après tout, en termes de sémantique, votre référence de fonction est stockée dans une variable, vous pouvez consulter via une variable nom .
la source
Certainement pas un nitpick, imo. Je l'utilise largement pour la lisibilité:
Donc:
Véritable fonction nommée dans "coffeescript"
Vous échappez pur JS via le backtick `
Notez que vous ne pouvez pas indenter votre corps de fonction.
À votre santé
la source
Ne perdez pas de temps à vous disputer avec les pédants. Ce n'est jamais fructueux. Oui, tout le monde sait ce que vous entendez par "fonction nommée" dans CoffeeScript, même si elle est techniquement incorrecte. Non, l'utilisation d'une terminologie techniquement incorrecte mais largement comprise n'a aucune incidence sur l'exactitude ou l'inexactitude de la solution proposée. Peut-on être plus précis sans gagner en maladresse de phrasé? Probablement pas. Cependant, cela ne signifie pas que les gens le laisseront glisser. Imaginez ce type à l'autre bout de la conversation.
La raison pour laquelle elle est techniquement incorrecte est que vous n'avez pas nommé la fonction, vous avez nommé une référence à la fonction. Considérer:
Quel est le nom de la fonction?
foo
etbar
font tous deux référence à la même fonction, mais ont des noms différents. De plus, soitfoo
oubar
pourrait être réaffecté à tout moment pour référencer une fonction différente, ou même un type complètement différent, sans changer la fonction elle-même.la source
Donc, la façon dont je lis ceci est comme ceci:
Lorsque vous déclarez une fonction dans une console JavaScript à l'aide de
puis invoquer
foo
sans parenthèses, il renvoieCependant, si vous le définissez en utilisant
puis invoquer à
foo
nouveau sans parenthèses, il renvoieDans le premier cas, je dirais que vous déclarez une variable nommée "foo" en y stockant une fonction anonyme. Dans le deuxième cas, je dirais que vous déclarez en fait une fonction nommée appelée "foo".
Étant donné que CoffeeScript utilise le premier modèle, je conviens qu'il est techniquement correct que les fonctions de CoffeeScript sont toutes des fonctions anonymes stockées dans des variables nommées.
la source