CoffeeScript 및 명명 된 함수


10

다른 곳에서는 CoffeeScript에서 명명 된 함수의 용어에 대해 논쟁이 일어났습니다. 특히 누군가 다음과 같은 것을 언급했습니다.

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

명명 된 함수로. 그러나 CoffeeScript의 모든 것은 익명의 함수이며 명명 된 함수는 없다고 반대했습니다. 이것은 확실히 사실입니다. CoffeeScript에는 함수 표현식 만 있으며 변수에 저장할 수 있습니다. 그러나 나는 이것이 명명 된 함수를 호출하는 것이 잘못되었음을 의미한다고 생각하지 않습니다.

보시다시피, 이름이 지정된 함수이기 때문에 이름이 지정된 함수입니다. 사실, 다른 언어가 함수를 명명 한 것과 같은 방식으로 명명 된 함수가 아니지만 명명 된 함수라고 부르는 것이 부적절하다고 생각합니다. 달리 주장하는 것은 단지 nitpicking 인 것 같습니다.

나는 이것이 명명 된 기능이 아니라고 주장하는 것이 단순히 따끔 거림이라고 생각하면서 점심을 먹습니까?


3
이 전체적인 질문이 단지 nitpicking이 아닙니까? :-)
Mat

@ 매트, 그래, nitpicking에 대한 nitpicking을 피할 수없는 것 같습니다
Winston Ewert

내가 말하고있는 작은 프로그래머 풀 (프로그래머 .SE 이외)의 경우, 그들은 보통 오래된 함수를 위해 변수에 저장된 익명 함수는 "클래스"(생성자)로 사용하기 위해 JavaScript의 명명 된 함수를 사용한다고 말합니다.
Sal

1
"단순히 따기"는 답이 중요하지 않으며 언어의 미묘함을 이해하는 것이 가치있는 목표가 아니라는 것을 의미합니다.
user229044

CoffeeScript와 유사하게 볼 수 있습니다 : 생성자 인 foo = ->단순한 오래된 함수 class Foo입니다. 나는 왜 foo = ->익명으로 엄격하게 불리어야 하는지에 대한 이유가 없다 .
Sal

답변:


20

CoffeeScript는 JavaScript와 불가분의 관계가 있으며 JavaScript는 다음과 같은 표현을 구분합니다.

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

실제로 다음과 같이 작성할 수도 있습니다.

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

이 차이는 JavaScript에서 중요하기 때문에 CoffeeScript에 대해 말할 때 동일한 용어를 사용하는 것이 좋습니다. 그러나 CoffeeScript는 function foo ()구문 과 같은 것을 지원 하지 않으므로 "명명 된"기능이 없다고 말할 수 있습니다.

어떤 의미에서 이름은의 함수 정의의 일부입니다 function foo() { ... }. 다른 경우에는 함수를 만들어 변수에 할당하면됩니다. 이것은 예를 들어 name함수 의 (비표준) 속성에 반영됩니다. 첫 번째 경우에는 foo.name당신 "foo"에게 줄 것이고 두 번째 경우에는 당신에게 줄 것 ""입니다.

또한 JavaScript에서는 이것들이 스코프에 도입되는 방식에 있어서도 다릅니다. 첫 번째 버전은 "게양"되어 두 번째 정의가 할당 된 후에 만 ​​사용 가능합니다.

기본적으로, 그것을 JavaScript 특정 전문 용어로 생각하십시오. CoffeeScript는 JS와 밀접하게 관련되어 있기 때문에 CoffeeScript로 전송됩니다.


1
와 같은 것이 없다는 것은 사실입니다 function foo () {}. 그러나 class구문을 통해 명명 된 함수를 여전히 초기화 할 수 있습니다 . 컴파일 된 CoffeeScript (결과 JavaScript)가 대부분의 명명 된 함수를 작성하는 방법보다 훨씬 장황합니다.
Sal

1
또한 기술적 인 경고가 있습니다. foo함수의 몸이 들어 올리지 않습니다.
Sal

1
질식 : 문제 없습니다. 내가 당신의 대답에 쓴 마지막 주석의 한 가지 수정 : 귀하 class foo의 함수 본문이 파일의 맨 위로 올라가지 않습니다.
Sal

CoffeeScript는 명명 된 함수와 익명 함수를 구별하지 않기 때문에 용어가 CoffeeScript로 이전되었다고 말할 수 있습니까? Javascript의 구별은 단순히 해당 언어의 의미를 의미하지 않습니다.
Winston Ewert 2016 년

@WinstonEwert : CoffeeScript가 JavaScript에 너무 가깝기 때문에 중요 합니다. 결국 "황금의 법칙"은 "그냥 JavaScript" 입니다.
Tikhon Jelvis 2016 년

5

사용자가 명시 적으로 "익명 함수를"명명 된 함수로 바꾸는 것 "이라고 말한 것은 주목할 가치가 있습니다.이 용어는 JavaScript 세계에서 기존의 강력한 의미와 다른 기능을 가진 용어입니다. 기존의 의미를 감안할 때, 그런 일은 없었으며, 나는 이것을 지적했다.

CoffeeScript는 JavaScript에서 아직 제거되지 않았으므로 한 언어로 다른 것을 의미하기 위해 공유하는 용어를 재정의해야합니다. CoffeeScript는 버블에 존재하지 않으며 JavaScript 구현에서 C ++이 Assembly와 분리되어 있다고 주장하는 방식으로 제거되었습니다. 익명 함수 및 명명 된 기능의 차이점을 알고 문제를 당신이 기대하는 경우 커피 스크립트 기능이 같은 행동 "이라는"때문에, 실제 라는 이름의 기능, 당신은 실망 할 겁니다 :

doStuff() # I cause an error

# ... later

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

동등한 JavaScript는 실제 이름이 지정된 함수 와 함께 잘 작동합니다 .

doStuff(); // I work just fine!

// later....

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

내가 그냥 "니트 픽킹"이라고했을지도 모르지만, 무엇? 컴퓨터의 미묘한 점은 프로그래밍 문제 , 그리고있는 "기술적으로"올바른 중요하다. 작동하는 코드 작성과 실제로 코드가 올바른 이유를 이해하는 것의 차이점 입니다.


1
예를 들어 파이썬에서 예제를 시도해도 여전히 작동하지 않습니다. 따라서 이름 지정된 함수와 익명 함수와 관련이 있는지 확실하지 않습니다.
Winston Ewert 2016 년

1
@WinstonEwert 내 업데이트를 참조하십시오. 파이썬은 실제로 그것과 관련이 없습니다 ...
user229044

@meager, 내 요점은 명명 된 함수가 Javascript로 작동하더라도 반드시 그렇게 행동하지는 않는다는 것입니다. 따라서 호이 스팅 자체가 CoffeeScript의 기능이 명명 된 것으로 간주되지 않도록 제한하지는 않습니다.
Winston Ewert 2016 년

네, CoffeeScript의 모든 함수는 익명이라는 것을 이해해야합니다 (실제로 모든 함수 표현식이라고 말하고 싶습니다). 그렇다고해서 가끔 용어를 느슨하게 할 수는 없습니다. 그렇기 때문에 나는 nitpicking이 당신이 그것들을 함수라고 부를 수 없다고 주장합니다.
Winston Ewert 2016 년

3

나는 이것이 명명 된 기능이 아니라고 주장하는 것이 단순히 따끔 거림이라고 생각하면서 점심을 먹습니까?

결국 의미 론적으로 함수 참조는 변수에 저장되며 변수 이름 을 통해 참조 할 수 있습니다 .


3

확실히 이쑤시개는 아닙니다. 가독성을 위해 광범위하게 사용합니다.

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

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

그러므로:

"커피 스크립트"의 실제 함수

hello()

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

당신은 백틱을 통해 순수한 JS를 탈출합니다`

함수 본문에는 들여 쓰기를 할 수 없습니다.

건배


1

pedants와 논쟁하는 시간을 낭비하지 마십시오. 결코 유익하지 않습니다. 그렇습니다. 기술적으로 틀리더라도 CoffeeScript의 "명명 된 기능"의 의미를 모든 사람이 알고 있습니다. 기술적으로 부정확하지만 널리 이해되는 용어를 사용한다고해서 제안 된 솔루션의 정확성 또는 부정확성과는 아무런 관련이 없습니다. 어색함을 얻지 않고 더 정확하게 할 수 있습니까? 아마 아닙니다. 그렇다고해서 사람들이 미끄러지게한다는 의미는 아닙니다. 대화의 다른 쪽 끝에있는 이 사람 을 상상해보십시오 .

기술적으로 잘못된 이유는 함수의 이름을 지정하지 않고 함수에 대한 참조의 이름을 지정했기 때문 입니다. 치다:

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

기능의 이름은 무엇입니까? foo그리고 bar모두 동일한 기능을 참조하지만 다른 이름을 가지고있다. 또한 함수 자체를 변경하지 않고 언제든지 다른 함수 또는 다른 유형을 참조하도록 언제든지 foo또는 bar재 할당 할 수 있습니다.


0

그래서, 이것을 읽는 방식은 다음과 같습니다.

다음을 사용하여 JavaScript 콘솔에서 함수를 선언 할 때

var foo = function() { ... }

foo괄호없이 호출 하면

function() { ... }

그러나 다음을 사용하여 정의하면

function foo() { ... }

foo괄호없이 다시 호출 하면

function foo() { ... }

첫 번째 경우에는 익명 함수를 저장하는 "foo"라는 변수를 선언한다고 가정하겠습니다. 두 번째 경우에는 실제로 "foo"라는 이름의 함수를 선언한다고합니다.

CoffeeScript는 첫 번째 패턴을 사용하기 때문에 CoffeeScript의 기능이 모두 명명 된 변수에 저장되는 익명의 기능이라는 것은 기술적으로 정확하다는 데 동의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.