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()
`}`
백틱`를 통해 순수한 JS를 이스케이프합니다.
함수 본문에서는 들여 쓰기 할 수 없습니다.
건배
답변
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 지역 정보를 사용하여 주소 정보를 반환하여 양식을 자동으로 채 웁니다.
따라서 페이지에로드되는 Rails 앱에 부분이 있습니다. 즉, DOM이 이미 생성되었으며 초기 페이지로드시 위의 함수를 호출하면 (ajax 호출이 부분을 렌더링하기 전에) jQuery는 $ ( ‘# property_street_address_1’) 요소를 볼 수 없습니다. 티).
따라서 요소가 페이지에 표시 될 때까지 google.maps.places.Autocomplete ()를 지연시켜야합니다.
부분이 성공적으로로드되면 Ajax 콜백을 통해이를 수행 할 수 있습니다.
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
그래서 여기서 본질적으로 우리는 foo ()를 호출하는 것과 같은 일을하고 있습니다.
답변
왜? 때문에 함수 선언은 악이다. 이 코드를보세요
function a() {
return 'a';
}
console.log(a());
function a() {
return 'b';
}
console.log(a());
출력에 무엇이 표시됩니까?
b
b
함수 정의를 사용하면
var a = function() {
return 'a';
}
console.log(a());
a = function() {
return 'b';
}
console.log(a());
출력은 다음과 같습니다.
a
b
답변
이 시도:
defineFct = (name, fct)->
eval("var x = function #{name}() { return fct.call(this, arguments); }")
return x
이제 다음은 “true”를 인쇄합니다.
foo = defineFct('foo', ()->'foo')
console.log(foo() == foo.name)
나는 실제로 이것을 사용하지 않지만 때때로 커피 기능에 내성을위한 이름이 있기를 바랍니다.
