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
'IT TIP' 카테고리의 다른 글
C # 애플리케이션에서 리소스와 임베디드 리소스의 차이점은 무엇입니까? (0) | 2020.10.12 |
---|---|
Python 다중 처리를 사용하여 난처한 병렬 문제 해결 (0) | 2020.10.12 |
파이썬 문자열 인턴 (0) | 2020.10.12 |
R에서 Excel로 쓸 때 java.lang.OutOfMemoryError 처리 (0) | 2020.10.12 |
Android가 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까? (0) | 2020.10.12 |