Em outros lugares , surgiu um argumento sobre a terminologia de uma função nomeada no CoffeeScript. Em particular, alguém se referiu a algo assim:
foo = ->
console.log("bar")
como uma função nomeada. Mas foi contestado que tudo no CoffeeScript é funções anônimas e não há funções nomeadas. Isso certamente é verdade, o CoffeeScript possui apenas expressões de função que podem ser armazenadas em uma variável. Mas eu não acho que isso significa que é errado chamar isso de função nomeada.
A meu ver, é uma função nomeada porque é uma função que recebeu um nome. É verdade que não é uma função nomeada da mesma maneira que algumas outras linguagens nomearam funções, mas acho que é próximo o suficiente para que não seja inadequado chamá-la de função nomeada. Insistir de outra maneira apenas parece ser uma questão.
Devo almoçar ao pensar que insistir que essa não é uma função nomeada é apenas uma brincadeira?
fonte
foo = ->
é apenas uma função antiga e simples, enquantoclass Foo
é um construtor. Não vejo razão parafoo = ->
que estritamente seja chamado de anônimo.Respostas:
O CoffeeScript está inexoravelmente vinculado ao JavaScript, e o JavaScript diferencia entre as seguintes expressões:
De fato, você pode até escrever:
Como essa diferença é importante no JavaScript, faz sentido usar os mesmos termos ao falar sobre o CoffeeScript. No entanto, o CoffeeScript não suporta nada como a
function foo ()
sintaxe, portanto, podemos dizer que não possui funções "nomeadas".Em certo sentido, o nome faz parte da definição da função no diretório
function foo() { ... }
onde, no outro caso, você apenas cria uma função e a atribui a uma variável. Isso se reflete, por exemplo, naname
propriedade (fora do padrão) das funções: no primeiro caso,foo.name
fornecerá a você"foo"
e no segundo, fornecerá""
.Além disso, no JavaScript, eles também diferem em termos de como eles são introduzidos no escopo: a primeira versão é "içada" e está disponível em todo o escopo, onde a segunda definição está disponível apenas após a atribuição.
Basicamente, pense nisso como um jargão específico para JavaScript, que é transferido para o CoffeeScript porque o CoffeeScript está intimamente relacionado ao JS.
fonte
function foo () {}
. No entanto, você ainda pode inicializar uma função nomeada por meio daclass
construção. Só que o CoffeeScript compilado (o JavaScript resultante) é muito mais detalhado do que o modo como a maioria escreveria uma função nomeada.foo
o corpo da sua função não será içado.class foo
corpo da função do seu não será içado no topo do arquivo.Vale a pena notar que o usuário declarou explicitamente que estava transformando uma "função anônima em uma função nomeada", ambos os termos com significados fortes e existentes e funcionalidades notavelmente diferentes no mundo do JavaScript. Dado o significado existente, eles não estavam fazendo isso, e eu apontei isso.
O CoffeeScript não está tão longe do JavaScript que você deve redefinir os termos que ambos compartilham para significar outra coisa em um idioma. O CoffeeScript não existe em algumas bolhas, removido da implementação do JavaScript da maneira que você pode argumentar que o C ++ é separado do Assembly. Saber a diferença entre uma função anônima e uma função nomeada é importante , porque se você espera que a função CoffeeScript "nomeada" se comporte como uma função nomeada real , você ficará desapontado:
O JavaScript equivalente funcionaria bem, com uma função nomeada real :
Você pode estar certo de que estou apenas "cutucando", mas e daí? Os pontos sutis da programação de computadores são importantes , e ser "tecnicamente" correto é importante. É a diferença entre escrever código que funciona e entender realmente por que seu código está correto .
fonte
Não. Afinal, em termos de semântica, sua referência de função é armazenada em uma variável, à qual você pode consultar por meio de um nome de variável .
fonte
Definitivamente não é um nitpick, imo. Eu o uso extensivamente para facilitar a leitura:
Portanto:
Função nomeada real em "coffeescript"
Você escapa JS puro através do backtick `
Observe que você não pode recuar no seu corpo funcional.
Felicidades
fonte
Não perca tempo discutindo com pedantes. Nunca é frutífero. Sim, todo mundo sabe o que você quer dizer com "função nomeada" no CoffeeScript, mesmo que seja tecnicamente incorreto. Não, o uso de terminologia tecnicamente incorreta, mas amplamente compreendida, não tem influência na correção ou incorreta da solução proposta. É possível ser mais preciso sem obter algum constrangimento de fraseado? Provavelmente não. No entanto, isso não significa que as pessoas vão deixar passar. Imagine esse cara do outro lado da conversa.
O motivo tecnicamente incorreto é que você não nomeou a função, nomeou uma referência à função. Considerar:
Qual o nome da função?
foo
ebar
estão fazendo referência à mesma função, mas têm nomes diferentes. Além disso, umfoo
oubar
pode ser reatribuído a qualquer momento para referenciar uma função diferente, ou mesmo um tipo diferente, sem alterar a própria função.fonte
Então, a maneira como eu li isso é assim:
Quando você declara uma função em um console JavaScript usando
e depois invocar
foo
sem parênteses, ele retornaNo entanto, se você o definir usando
e depois invocar
foo
novamente sem parênteses, ele retornaNo primeiro caso, eu diria que você está declarando uma variável chamada "foo" armazenando uma função anônima nela. No segundo caso, eu diria que você está realmente declarando uma função nomeada chamada "foo".
Como o CoffeeScript usa o primeiro padrão, eu concordo que é tecnicamente correto que as funções do CoffeeScript sejam todas funções anônimas sendo armazenadas em variáveis nomeadas.
fonte