Coffeescript — 자체 시작 익명 함수를 만드는 방법은 무엇입니까?


답변:


160

괄호 만 사용할 수 있지만 (예 :) 키워드 (-> foo)()를 사용하여 피할 수 있습니다 do.

do f = -> console.log 'this runs right away'

가장 일반적인 용도 do는 루프에서 변수를 캡처하는 것입니다. 예를 들어

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

이 없으면 루프 이후의 do값을 x3 번 인쇄합니다 .


24
당신은 또한 쓸 수 있습니다f = do -> console.log x
scribu

5
@scribu 글쎄, 그 두 진술은 매우 다르며 실제로 당신의 진술은 내가 말 했어야 할 진술입니다. Mine은 함수 -> console.log 'this runs right away'를에 할당 f한 다음 실행합니다. 당신은 f원래 질문에서 와 같이 함수를 실행 한 다음 그 결과를에 할당합니다 . (의 경우 console.log반환 값은 항상 undefined어쨌든입니다.)
Trevor Burnham

1
바로 그거죠. 또한 다음과 같이 개체 속성을 정의 할 수 있습니다.{f: do -> // something}
scribu

2
CoffeeScript 1.3.1 (2012 년 4 월 릴리스)부터는 do함수에 인수를 전달할 수도 있습니다. 전달하려면 12매개 변수 xy를 작성하십시오 do (x = 1, y = 2) ->. (이 기능에 대한 문서가있다 손실 쪘 지만, 이 기능이 도입 된 문제는 몇 가지 예제가 있습니다.)
로리 O'Kane

19

CoffeeScript의 자체 호출 함수에 전달 된 인수를 "별칭"하고 싶다면 다음과 같이 달성하려고합니다.

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

그럼 do (window, document) ->그렇게 놔두지 않을 것입니다. 갈 방법은 괄호를 사용하는 것입니다.

(( global, doc ) -> 
  # your code here
)( window, document ) 

5
do (global=window, doc=document) ->
Billy Moon

16

커피는 말도 안되게 쉽습니다.

do ->

돌아올 것이다

(function() {})();

5

또한 do키워드를 기본 함수 매개 변수와 결합하여 재귀 "자체 시작 함수"를 초기 값으로 시드 할 수 있습니다 . 예:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

이것은 범위 지정에 유용한 자체 실행 클로저를 생성합니다.


1
이것은 이미 게시 된 다른 답변에 비해 새로운 정보를 많이 추가하지 않는 것 같습니다. 경쟁적인 답변을 만드는 대신 다른 답변에 명확성 또는 유용한 정보를 추가하는 유익한 댓글을 게시하여 더 많은 가치를 추가 할 수 있습니다.
still_dreaming_1 2005

1

죄송합니다. 해결했습니다.

f = (
    () -> "something"
)()

1
@ Squeegy 나는 반드시 그렇게 말하지 않을 것입니다. do키워드가 필요 때로는 JS 스타일의 접근 방식을 사용할 수 있도록 몇 가지 제한 사항이 있습니다 (참조 문제 960 ); do실제로 폐쇄 형 루프 사용 사례 때문에 추가되었습니다.
Trevor Burnham

1
그러나 우리는 CoffeeScript를 사용하여 얼굴을 찌르는 것도 아닙니다.
Brandon

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