W innym miejscu pojawił się spór o terminologię nazwanej funkcji w CoffeeScript. W szczególności ktoś odniósł się do czegoś takiego:
foo = ->
console.log("bar")
jako nazwana funkcja. Jednak sprzeciwiano się temu, że wszystko w CoffeeScript jest funkcjami anonimowymi i nie ma żadnych nazwanych funkcji. Jest to z pewnością prawda, CoffeeScript ma tylko wyrażenia funkcyjne, które można następnie przechowywać w zmiennej. Ale nie sądzę, aby to oznaczało, że błędem jest nazywanie tej funkcji nazwanej.
Według mnie jest to funkcja nazwana, ponieważ jest to funkcja, której nadano nazwę. To prawda, że nie jest to funkcja nazwana w taki sam sposób, jak niektóre inne języki nazwały funkcje, ale myślę, że jest wystarczająco blisko, aby nazwać ją funkcją nazwaną. Domaganie się czegoś innego wydaje się po prostu podstępne.
Czy jestem na lunchu, myśląc, że upieranie się, że nie jest to nazwana funkcja, to tylko nitpicking?
źródło
foo = ->
jest to po prostu stara funkcja, podczas gdyclass Foo
jest konstruktorem. Nie widzę powodu, dla któregofoo = ->
miałby być nazywany anonimowym.Odpowiedzi:
CoffeeScript jest nieuchronnie powiązany z JavaScript, a JavaScript rozróżnia następujące wyrażenia:
W rzeczywistości możesz nawet napisać:
Ponieważ ta różnica ma znaczenie w JavaScript, sensowne jest używanie tych samych terminów przy mówieniu o CoffeeScript. Jednak CoffeeScript nie obsługuje niczego takiego jak
function foo ()
składnia, więc możemy powiedzieć, że nie ma funkcji „nazwanych”.W pewnym sensie nazwa jest częścią definicji funkcji w
function foo() { ... }
, gdzie w innym przypadku po prostu tworzysz funkcję i przypisujesz ją do zmiennej. Odzwierciedla to na przykład (niestandardowa)name
właściwość funkcji: w pierwszym przypadkufoo.name
da ci,"foo"
aw drugim da ci""
.Dodatkowo, w JavaScript, różnią się one również sposobem wprowadzenia do zakresu: pierwsza wersja jest „podnoszona” i dostępna w całym jej zakresie, gdzie druga definicja jest dostępna dopiero po przypisaniu.
Zasadniczo pomyśl o tym jak o żargonie specyficznym dla JavaScript, który jest przenoszony do CoffeeScript, ponieważ CoffeeScript jest tak blisko związany z JS.
źródło
function foo () {}
. Nadal jednak można zainicjować nazwaną funkcję za pomocąclass
konstrukcji. Tyle tylko, że skompilowany CoffeeScript (wynikowy JavaScript) jest o wiele bardziej szczegółowy niż większość osób, które napisałyby nazwaną funkcję.foo
ciało twojej funkcji nie zostanie podniesione.class foo
ciało funkcji nie zostanie przeniesione na początek pliku.Warto zauważyć, że użytkownik wyraźnie stwierdził, że przekształca „funkcję anonimową w funkcję nazwaną”, przy czym oba terminy mają silne, istniejące znaczenie i szczególnie różne funkcje w świecie JavaScript. Biorąc pod uwagę istniejące znaczenie, nie robili nic takiego i wskazałem na to.
CoffeeScript nie jest tak daleko od JavaScriptu, że powinieneś na nowo zdefiniować terminy, które oba udostępniają, aby oznaczać coś innego w jednym języku. CoffeeScript nie istnieje w jakiejś bańce, usunięty z implementacji JavaScript w sposób, w jaki można argumentować, że C ++ jest oddzielony od asemblera. Znajomość różnicy między funkcją anonimową a funkcją nazwaną jest ważna , ponieważ jeśli oczekujesz, że funkcja „nazwana” CoffeeScript będzie zachowywać się jak funkcja o nazwie rzeczywistej , będziesz rozczarowany:
Odpowiednik JavaScript działałby dobrze, z prawdziwie nazwaną funkcją:
Może masz rację, że po prostu „robię dupki”, ale co z tego? Subtelne punkty w komputerze programowania sprawa , i jest „technicznie” poprawne jest ważne. Różnica między pisaniem kodu, który akurat działa, a faktycznym zrozumieniem, dlaczego kod jest poprawny .
źródło
Nie. W końcu, jeśli chodzi o semantykę, odwołanie do funkcji jest przechowywane w zmiennej, do której można się odwoływać poprzez nazwę zmiennej .
źródło
Zdecydowanie nie jest głupkiem, imo. Używam go szeroko dla czytelności:
A zatem:
Prawdziwie nazwana funkcja w „coffeescript”
Uciekasz przed czystym JS poprzez backstick `
Zauważ, że nie możesz wciskać się w ciało funkcji.
Twoje zdrowie
źródło
Nie trać czasu na kłótnie z pedantami. To nigdy nie jest owocne. Tak, wszyscy wiedzą, co rozumiesz przez „nazwaną funkcję” w CoffeeScript, nawet jeśli jest to technicznie niepoprawne. Nie, stosowanie technicznie niepoprawnej, ale szeroko rozumianej terminologii nie ma wpływu na poprawność lub nieprawidłowość proponowanego rozwiązania. Czy można być bardziej precyzyjnym bez niewygodnego frazowania? Prawdopodobnie nie. Nie oznacza to jednak, że ludzie pozwolą się zsuwać. Wyobraź sobie tego faceta po drugiej stronie rozmowy.
Jest to technicznie niepoprawne, ponieważ nie nazwałeś funkcji, nazwałeś jej odwołanie . Rozważać:
Jak nazywa się ta funkcja?
foo
ibar
oba odnoszą się do tej samej funkcji, ale mają różne nazwy. Ponadto albo możnafoo
albobar
w dowolnym momencie zmienić przypisanie, aby odwoływać się do innej funkcji, a nawet zupełnie innego typu, bez zmiany samej funkcji.źródło
Sposób, w jaki to czytam, jest następujący:
Gdy deklarujesz funkcję w konsoli JavaScript za pomocą
a następnie wywołuje
foo
bez nawiasów, zwracaJeśli jednak zdefiniujesz to za pomocą
a następnie wywołuje
foo
ponownie bez nawiasów, zwracaW pierwszym przypadku powiedziałbym, że deklarujesz zmienną o nazwie „foo” przechowującą w niej anonimową funkcję. W drugim przypadku powiedziałbym, że faktycznie deklarujesz nazwaną funkcję o nazwie „foo”.
Ponieważ CoffeeScript używa pierwszego wzorca, zgodzę się, że technicznie poprawne jest, że wszystkie funkcje CoffeeScript są anonimowymi funkcjami przechowywanymi w nazwanych zmiennych.
źródło