CoffeeScript e funzioni denominate

10

Altrove , è sorto un argomento sulla terminologia di una funzione con nome in CoffeeScript. In particolare qualcuno si riferiva a qualcosa del genere:

 foo = ->
    console.log("bar")

come funzione con nome. Ma è stato obiettato che tutto in CoffeeScript è funzioni anonime e non ci sono funzioni con nome. Questo è certamente vero, CoffeeScript ha solo espressioni di funzione che possono quindi essere memorizzate in una variabile. Ma non penso che questo significhi che sia sbagliato chiamarlo una funzione con nome.

Come la vedo io, è una funzione con nome perché è una funzione a cui è stato assegnato un nome. È vero, non è una funzione con nome nello stesso modo in cui alcuni altri linguaggi hanno chiamato funzioni, ma penso che sia abbastanza vicino da non essere inopportuno chiamarlo una funzione con nome. Insistere diversamente sembra essere il pignolo.

Sono uscito a pranzo pensando che insistendo sul fatto che non si tratta di una funzione con nome è solo il pignolo?

    
posta Winston Ewert 19.03.2013 - 20:00
fonte

6 risposte

20

CoffeeScript è inesorabilmente legato a JavaScript e JavaScript distingue tra le seguenti espressioni:

function foo() { ... }
var foo = function () { ... }

In effetti, puoi anche scrivere:

var foo = function bar () { ... }

Poiché questa differenza è importante in JavaScript, ha senso usare gli stessi termini quando si parla di CoffeeScript. Tuttavia, CoffeeScript non supporta nulla come la sintassi function foo () , quindi possiamo dire che non ha funzioni "nominate".

In un certo senso, il nome fa parte della definizione della funzione in function foo() { ... } , dove nell'altro caso devi solo creare una funzione e assegnarla a una variabile. Ciò si riflette, ad esempio, nella proprietà (non standard) name delle funzioni: nel primo caso, foo.name ti darà "foo" e nel secondo ti darà "" .

Inoltre, in JavaScript, anche questi differiscono in termini di come vengono introdotti nell'oscilloscopio: la prima versione è "issata" e disponibile in tutto il suo ambito in cui la seconda definizione è disponibile solo dopo che è stata assegnata.

Fondamentalmente, basti pensare a un jargon specifico di JavaScript, che viene trasferito a CoffeeScript perché CoffeeScript è così strettamente correlato a JS.

    
risposta data 19.03.2013 - 20:20
fonte
5

Vale la pena notare che l'utente ha esplicitamente dichiarato che stava trasformando una "funzione anonima in una funzione denominata", entrambi i termini hanno un significato strong, esistente e funzionalità notevolmente differenti nel mondo JavaScript. Dato il significato attuale, non stavano facendo nulla del genere, e ho sottolineato questo.

CoffeeScript non è così lontano da JavaScript che dovresti ridefinire i termini che entrambi condividono per significare qualcos'altro in una lingua. CoffeeScript non esiste in alcune bolle, rimosso dalla sua implementazione JavaScript come si potrebbe sostenere che C ++ sia separato dall'Assembly. Conoscere la differenza tra una funzione anonima e una funzione denominata importa , perché se ti aspetti che la funzione CoffeeScript "nominata" si comporti come una funzione denominata effettiva , hai intenzione di essere deluso:

doStuff() # I cause an error

# ... later

doStuff = (x,y) ->
  alert("Were I actually a named function, this would work!")

Lo JavaScript equivalente funzionerebbe bene, con una funzione denominata real :

doStuff(); // I work just fine!

// later....

function doStuff() {
  alert("I'm a real named function!")
}

Potresti avere ragione che sto solo "pignolando", ma allora? I punti sottili nella programmazione del computer importa , ed essere "tecnicamente" corretti sono importanti. È la differenza tra scrivere codice che funziona e capire effettivamente perché il tuo codice è corretto .

    
risposta data 19.03.2013 - 20:19
fonte
3

Am I out to lunch in thinking that insisting that this isn't a named function is just nitpicking?

No. Dopotutto, in termini di semantica, il riferimento alla funzione è memorizzato in una variabile, a cui puoi fare riferimento tramite una variabile nome .

    
risposta data 19.03.2013 - 20:07
fonte
3

Sicuramente non un nitpick, imo. Lo uso estensivamente per la leggibilità:

readfile()
dothis()
dothat()
thistoo()
writefile()

function readfile() {
    ...
}
...

In questo modo:

Funzione con nome reale in "coffeescript"

hello()

'function hello() {'
console.log 'hello'
dothings()
'}'

Sfuggi puro JS tramite l'apice '

Notare che non è possibile indentare il proprio corpo funzione.

Saluti

    
risposta data 25.03.2014 - 01:49
fonte
1

Non perdere tempo a discutere con i pedanti. Non è mai fruttuoso. Sì, tutti sanno cosa intendi per "funzione denominata" in CoffeeScript, anche se tecnicamente non è corretto. No, l'utilizzo di una terminologia tecnicamente errata ma ampiamente comprensibile non incide sulla correttezza o l'erroneità della soluzione proposta. È possibile essere più precisi senza guadagnare qualche imbarazzo nel fraseggio? Probabilmente no. Tuttavia, ciò non significa che la gente lo lascerà scivolare. Immagina questo tipo dall'altra parte della conversazione.

Il motivo per cui è tecnicamente scorretto è perché non hai nominato la funzione, hai nominato un riferimento alla funzione. Prendere in considerazione:

foo = bar = ->
  console.log "What's my name?"

Qual è il nome della funzione? foo e bar fanno entrambi riferimento alla stessa funzione, ma hanno nomi diversi. Inoltre, sia foo che bar possono essere riassegnati in qualsiasi momento per fare riferimento a una funzione diversa o addirittura a un tipo diverso, senza modificare la funzione stessa.

    
risposta data 25.03.2014 - 05:51
fonte
0

Quindi, il modo in cui leggo questo è il seguente:

Quando dichiari una funzione in una console JavaScript utilizzando

var foo = function() { ... }

e quindi invoca foo senza parentesi, restituisce

function() { ... }

Tuttavia, se lo definisci utilizzando

function foo() { ... }

e quindi richiamare foo di nuovo senza parentesi, restituisce

function foo() { ... }

Nel primo caso, direi che stai dichiarando una variabile chiamata "foo" che contiene una funzione anonima. Nel secondo caso, direi che in realtà stai dichiarando una funzione chiamata "foo".

Poiché CoffeeScript utilizza il primo pattern, sono d'accordo sul fatto che è tecnicamente corretto che le funzioni di CoffeeScript siano tutte le funzioni anonime memorizzate in variabili denominate.

    
risposta data 25.03.2014 - 05:54
fonte

Leggi altre domande sui tag