즉각적인 함수 호출 구문


110

JSLint의 옵션, 사실 좋은 부분 중 하나는 건축 것을 의미한다 "즉시 호출 주위에 괄호 [필요한]을"는,

(function () {

  // ...

})();

대신 다음과 같이 작성해야합니다.

(function () {

  // ...

}());

내 질문은 이것이다. 누군가이 두 번째 양식이 더 나은 것으로 간주되는 이유를 설명 할 수 있습니까? 더 탄력적입니까? 오류가 덜 발생합니까? 첫 번째 형태에 비해 어떤 이점이 있습니까?


이 질문을하면서 함수 값과 함수 값을 시각적으로 명확하게 구분하는 것의 중요성을 이해하게되었습니다. 즉각적인 호출의 결과가 할당 표현식의 오른쪽 인 경우를 고려하십시오.

var someVar = (function () {

  // ...

}());

최 괄호 구문이 불필요하지만, 개구 괄호의 값이 할당되고 있다는 선행 표시가 제공 되지 함수 자체가 아니라 함수의 결과가 호출된다.

이것은 생성자 함수의 대문자 사용에 관한 Crockford의 조언과 유사합니다. 소스 코드를 보는 모든 사람에게 시각적 신호 역할을하기위한 것입니다.


지적 해 주셔서 감사합니다. JSLint의 경고 메시지 "루프 내에서 함수를 만들 때주의하십시오"를 제거하는 방법을 찾지 못했습니다. 나는 조심했고 함수를 클로저에 넣었지만 JSLint는 여전히 불평했습니다. 이제 두 번째 패턴을 사용했다고 가정했습니다.
viam0Zah


나는 지금까지 "잘못"해왔다. 내가 말할 때 "모든 시간을,"나는 1995 년부터 자바 스크립트를 작성했습니다
데이브 랜드에게

답변:


73

Douglass Crockford의 스타일 컨벤션 가이드에서 : ( "즉시 호출 됨"검색)

함수가 즉시 호출되어야하는 경우 전체 호출 표현식을 괄호로 래핑하여 생성되는 값이 함수 자체가 아니라 함수의 결과임을 명확히해야합니다.

그래서 기본적으로 그는 그것이 함수 값과 함수 값 사이의 구별을 더 명확하게한다고 느낍니다. 따라서 이것은 코드 자체의 실질적인 차이가 아니라 문체 문제입니다.

업데이트 된 참조, 이전 PPT가 더 이상 존재하지 않음


1
이 글을 읽어서 기쁩니다. 방금 Javascript : The Good Parts를 읽었습니다. 제가 계속 생각한 것은 함수 호출의 결과를 할당하는 것은 구문이 정말 좋지 않다는 것입니다. 왜냐하면 무슨 일이 일어나고 있는지 이해하려면 첫 번째와 마지막 줄을 살펴 봐야하기 때문입니다. 그는 책에서 포장 괄호를 사용하지 않지만 그가 왜 그들을 추천하는지 정확히 알 수 있습니다.
Skilldrick

2
@altCognito, PPT에 대한 새로운 링크를 제공 할 수 있습니까?
th1rdey3 2013-10-30

1
나는 웹을 통해 보았다,하지만 난 아직도 그 PPT의 사본을 찾을 수 없습니다
Forethinker

1
원본 PPT를 찾을 수 없었지만 그의 자바 스크립트 컨벤션 가이드에서 찾은 것과 같은 점을 찾을 수있었습니다.
cgp 2014-07-29

archive.org가 있습니까?
John Greene

2

즉시 호출 된 익명 함수는 다음과 같은 이유로 괄호로 래핑됩니다.

  1. 그것들은 함수 표현식이며 괄호를 생략하면 구문 오류 인 함수 선언으로 해석됩니다.

  2. 함수 표현식은 function이라는 단어로 시작할 수 없습니다.

  3. 함수 표현식을 변수에 할당 할 때 함수 자체가 반환되지 않고 함수의 반환 값이 반환됩니다., 따라서 괄호는 그 안에 무엇이 있는지 평가하고 값을 생성합니다.함수가 실행되고 후행 괄호로 ..}()인해 함수가 즉시 실행됩니다.


Dathan, 당신은 다른 질문에 대답하고 있습니다. 구문 분석기가 함수 선언과 함수 표현식을 구분할 수 있도록 둘러싸는 괄호가 구문 적으로 필요한 경우가 있습니다. 그러나 내 질문은 호출 괄호의 배치에 관한 것입니다. 세 번째 요점은 정확하지 않습니다. 이 경우 둘러싸는 괄호는 필요하지 않습니다.
Bobby Eickhoff

즉시 호출 된 익명 함수가 변수에 할당되지 않았으므로 처음 두 가지 이유로 괄호가 구문 적으로 필요한 첫 번째 예에 대답했습니다. 세 번째 이유는 "여는 괄호는 할당되는 값이 함수 자체가 아니라 호출 된 함수의 결과라는 것을 미리 알려줍니다."라고 말한 내용을 복원하는 것입니다. 하지만 명확하지 않은 것 같습니다.
다단

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