IT TIP

CoffeeScript의 함수 선언

itqueen 2020. 10. 12. 21:19
반응형

CoffeeScript의 함수 선언


CoffeeScript에서 다음을 사용하여 함수를 정의하면 알 수 있습니다.

a = (c) -> c=1

함수 표현식 만 얻을 수 있습니다 .

var a;
a = function(c) {
    return c = 1;
};

그러나 개인적으로 나는 종종 함수 선언을 사용 합니다 .

function a(c) {
    return c = 1;
}

첫 번째 양식을 사용하지만 CoffeeScript에서 함수 선언을 생성하는 방법이 있는지 궁금합니다. 그런 방법이 없다면 CoffeeScript가이 작업을 피하는 이유를 알고 싶습니다. 함수가 범위의 맨 위에 선언되는 한 JSLint가 선언 오류를 외칠 것이라고 생각하지 않습니다.


CoffeeScript는 함수 선언 (일명 "명명 된 함수")을 class정의 라는 한 곳에서 사용 합니다. 예를 들어

class Foo

컴파일

var Foo;
Foo = (function() {
  function Foo() {}
  return Foo;
})();

FAQ 에 따르면 CoffeeScript가 다른 곳에서 함수 선언을 사용하지 않는 이유는 다음과 같습니다.

이 문제에 대해 Microsoft를 비난하십시오. 원래 의미있는 이름을 검색 할 수있는 모든 함수에는 하나가 주어졌지만 IE 버전 8 이하에서는 명명 된 함수가 선언과 표현식 모두로 처리되는 범위 지정 문제가 있습니다. 참조 자세한 내용은.

간단히 말해서, 함수 선언을 부주의하게 사용하면 IE (9 이전)와 다른 JS 환경간에 불일치가 발생할 수 있으므로 CoffeeScript는이를 피합니다.


그래 넌 할수있어:

hello()

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

백틱`

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

건배


CoffeeScript에서 명심해야 할 한 가지는 항상 JavaScript로 돌아갈 수 있다는 것입니다. CoffeeScript는 명명 된 함수 선언을 지원하지 않지만 언제든지 JavaScript로 돌아와이를 수행 할 수 있습니다.

http://jsbin.com/iSUFazA/11/edit

# http://jsbin.com/iSUFazA/11/edit
# You cannot call a variable function prior to declaring it!
# alert csAddNumbers(2,3) # bad!

# CoffeeScript function
csAddNumbers = (x,y) -> x+y

# You can call a named function prior to
# delcaring it
alert "Calling jsMultiplyNumbers: " + jsMultiplyNumbers(2,3) # ok!

# JavaScript named function
# Backticks FTW!
`function jsMultiplyNumbers(x,y) { return x * y; }`

CoffeeScript에서 큰 함수를 작성한 다음 백틱 트릭을 사용하여 JavaScript가 다른 함수를 호출하도록 할 수도 있습니다.

# Coffeescript big function
csSomeBigFunction = (x,y) ->
   z = x + y
   z = z * x * y
   # do other stuff
   # keep doing other stuff

# Javascript named function wrapper
`function jsSomeBigFunction(x,y) { return csSomeBigFunction(x,y); }`

아니요, 커피 스크립트에서 함수를 정의하고 커피 스크립트에서 함수 선언을 생성하도록 할 수 없습니다.

그냥 써도

-> 123

생성 된 JS는 괄호로 래핑되어 함수 표현식이됩니다.

(function() {
  return 123;
});

내 생각 엔 이것이 커피 스크립트 소스의 논리적 흐름을 깨뜨리는 함수 선언이 둘러싸는 범위의 맨 위로 "게양"되기 때문이라고 생각합니다.


이전 게시물이지만 향후 Google 직원을 위해 대화에 추가하고 싶었습니다.

OP는 순수 CoffeeScript에서 함수를 선언 할 수 없다는 점에서 정확합니다 (CoffeeScript 파일 내에서 순수 JS를 이스케이프하기 위해 백틱을 사용하는 아이디어 제외).

하지만 우리가 할 수있는 것은 함수를 창에 바인딩하는 것이며 본질적으로 이름이 지정된 함수 인 것처럼 호출 할 수있는 것으로 끝납니다. 나는 이것이 명명 된 함수 라고 말하는 것이 아니라, 순수한 CoffeeScript를 사용하여 OP가 실제로하고 싶은 일 (코드 어딘가에서 foo (param)과 같은 함수 호출)을 수행하는 방법을 제공하고 있습니다.

다음은 coffeescript의 창에 연결된 함수의 예입니다.

window.autocomplete_form = (e) ->
    autocomplete = undefined
    street_address_1 = $('#property_street_address_1')
    autocomplete = new google.maps.places.Autocomplete(street_address_1[0], {})
    google.maps.event.addListener autocomplete, "place_changed", ->
        place = autocomplete.getPlace()

        i = 0

        while i < place.address_components.length
            addr = place.address_components[i]
            st_num = addr.long_name if addr.types[0] is "street_number"
            st_name = addr.long_name if addr.types[0] is "route"

            $("#property_city").val addr.long_name if addr.types[0] is "locality"
            $("#property_state").val addr.short_name if addr.types[0] is "administrative_area_level_1"
            $("#property_county").val (addr.long_name).replace(new RegExp("\\bcounty\\b", "gi"), "").trim() if addr.types[0] is "administrative_area_level_2"
            $("#property_zip_code").val addr.long_name if addr.types[0] is "postal_code"
            i++

        if st_num isnt "" and (st_num?) and st_num isnt "undefined"
            street1 = st_num + " " + st_name
        else
            street1 = st_name

        street_address_1.blur()
        setTimeout (->
            street_address_1.val("").val street1
            return
            ), 10
        street_address_1.val street1
        return

이것은 Google 지역 정보를 사용하여 주소 정보를 반환하여 양식을 자동으로 채 웁니다.

So we have a partial in a Rails app which is being loaded into a page. This means the DOM is already created, and if we call the function above on initial page load (before the ajax call renders the partial), jQuery won't see the $('#property_street_address_1') element (trust me - it didn't).

So we need to delay the google.maps.places.Autocomplete() until after the element is present on the page.

We can do this via the Ajax callback on successful load of the partial:

            url = "/proposal/"+property_id+"/getSectionProperty"
            $("#targ-"+target).load url, (response, status, xhr) ->
                if status is 'success'
                    console.log('Loading the autocomplete form...')
                    window.autocomplete_form()
                    return

            window.isSectionDirty = false

So here, essentially, we're doing the same thing as calling foo()


Why? Because function declaration is evil. Look at this code

function a() {
        return 'a';
}

console.log(a());

function a() {
        return 'b';
}

console.log(a());

What will be on the output?

b
b

If we use the function definition

var a = function() {
        return 'a';
}

console.log(a());

a = function() {
        return 'b';
}

console.log(a());

the output is:

a
b

Try this:

defineFct = (name, fct)->
  eval("var x = function #{name}() { return fct.call(this, arguments); }")
  return x

Now the following will print "true":

foo = defineFct('foo', ()->'foo')
console.log(foo() == foo.name)

I don't actually use this, but do sometimes wish coffee functions had names for introspection.

참고URL : https://stackoverflow.com/questions/6548750/function-declaration-in-coffeescript

반응형