JavaScript에서 널리 사용되는 다른 함수에 대한 인수로 큰 익명 함수를 전달하는 이유는 무엇입니까?


27

다른 함수에 대한 인수가 가독성과 자체 문서화에 크게 영향을 미치므로 몇 줄 이상의 코드가 포함 된 익명 함수를 전달 하면 의견 이 있습니다. 누구나 코드를 사용하여 명명 된 함수를 선언하는 것이 훨씬 좋습니다. 또는 적어도 함수 를 선언하기 전에 해당 익명 함수를 변수에 할당하십시오.

그러나 많은 JavaScript 라이브러리 (jQuery, d3.js / NVD3.js)는 몇 가지 예를 제공하기 위해이 방법으로 큰 함수를 사용합니다.

이것이 JavaScript에서 왜 그렇게 널리 받아 들여 집니까? 그것은 문화적인 것입니까, 아니면 내가 놓친 장점이 있습니까? 이는 명명 된 기능을 선언하는 것보다 사용을 더 선호하게합니까?


1
아마도 클로저 를 사용하는 것과 관련이있을 것입니다 . 또한 실제 기능을 외부 세계에 노출시키지 않기를 원할 수도 있습니다 (그래서 익명입니다).
Robert Harvey

3
@RobertHarvey 즉, 공개비공개가 없는 JavaScript의 해결 방법 입니까?
메이슨 휠러

2
많은 곳에서 큰 익명 함수는 블록처럼 읽히고 일반적으로 익숙해지면 꽤 좋아집니다. 범위 지정 규칙은 블록 느낌을 지원합니다.

5
@MasonWheeler : 그것은 당신의 관점에 달려 있습니다. 구성표 또는 ECMAScript 프로그래머는이를 말할 수 public있으며 private적절한 닫힘이없는 해결 방법입니다.
Jörg W Mittag

답변:


23

내가 생각할 수있는 세 가지 주요 이유 :

  1. 부모 범위 액세스
  2. 은둔
  3. 더 높은 범위에서 정의 된 이름 감소

상위 범위 액세스 : 인라인 함수 정의를 통해 인라인 코드가 상위 범위에 정의 된 변수에 액세스 할 수 있습니다. 이것은 많은 것들에 매우 유용 할 수 있으며 올바르게 수행되면 코드의 양이나 복잡성을 줄일 수 있습니다.

이 범위 밖에서 정의 된 함수에 코드를 넣은 다음 코드를 호출하면 함수에 액세스하려는 상위 상태를 전달해야합니다.

개인 정보 : 인라인 익명 정의 내의 코드는 더 비공개이며 다른 코드에서 호출 할 수 없습니다.

더 높은 범위에서 정의 된 이름 감소 : 이것은 글로벌 범위에서 작동 할 때 가장 중요하지만 인라인 익명 선언은 현재 범위에서 새 심볼을 정의하지 않아도됩니다. Javascript는 기본적으로 네임 스페이스를 사용할 필요가 없으므로 최소한 필요한 것보다 더 많은 전역 기호를 정의하지 않는 것이 좋습니다.


편집 : 익명 인라인으로 선언하는 것이 어떻게 함수를 정의하고 부모 범위 액세스가 사용되지 않는 경우에도 호출하는 것보다 "더 나은"것으로 간주되는 Javascript의 문화적인 것으로 보입니다. 이것이 처음에는 Javascript의 전역 네임 스페이스 오염 문제 때문인 것으로 보이며 개인 정보 문제 때문일 수 있습니다. 그러나 이제는 다소 문화적인 것으로 바뀌 었으며 많은 공공 기관 (예 : 언급 한 것)으로 표현 된 것을 볼 수 있습니다.

C ++과 같은 언어에서는 대부분 많은 페이지 / 화면에 걸쳐 하나의 거대한 기능을 갖는 것이 바람직하지 않은 관행이라고 생각할 것입니다. 물론 C ++에는 네임 스페이스가 내장되어 있으며 부모 범위 액세스를 제공하지 않으며 개인 정보 보호 기능이 있으므로 가독성 / 유지 관리로 완전히 동기를 부여 할 수 있지만 Javascript는 개인 정보 보호 및 부모 범위 액세스를 달성하기 위해 코드 표현식을 사용해야합니다. 따라서 JS는 방금 다른 방향으로 동기가 부여 된 것으로 보이며 특정 경우에 방향을 동기 부여 한 것이 필요하지 않은 경우에도 언어 내에서 다소 문화적인 것이되었습니다.


C ++ 개발자가 최근 많은 작업을 위해 JS로 옮길 때이 대답은 특히 '부모 범위 액세스'포인트와 관련이 있습니다. 실제로 코드를 크게 단순화 할 수있는 힘이 있습니다. 하나의 nitpick-C ++은 C ++ 11 람다에서 부모 범위 액세스를 제공합니다 :) 확실히 +1.
사령관 고수 인 도롱뇽

8

익명 함수는 대부분의 언어에서보다 JavaScript에서 더 많은 목적으로 사용됩니다.

먼저 네임 스페이스 및 블록 범위 지정에 사용됩니다. 최근까지 자바 스크립트에는 모듈이나 다른 종류의 네임 스페이스 메커니즘이 없었기 때문에 익명 함수를 사용하여 모듈 패턴을 통해 해당 기능을 제공하게되었습니다. 이러한 기능의 이름을 지정하면 아무런 이점이 없습니다. 더 작은 규모로, 최근까지 JavaScript의 블록 범위 지정 이 없기 때문에 비슷한 패턴이 블록 범위 지정을 모방하는 데 사용되었습니다. 루프 본문에서 가장 두드러집니다. 이 경우 명명 된 함수를 사용하는 것은 적극적으로 난독 화됩니다.

둘째, JavaScript에 덜 의존적 인 익명 함수는 종종 제어 구조를 모방하는 고차 함수와 함께 사용됩니다. 예를 들어, jQuery의 each메소드입니다. 몇 줄 이상이 될 때마다 모든 루프 본문 또는 if-branch를 함수로 추상화하지는 않습니다. 이 경우에도 동일한 논리가 적용됩니다.

마지막 이유는 JavaScript에서 이벤트 기반 프로그래밍이 일반적이기 때문에 부주의 한 연속 전달 스타일 코드 가 생길 수 있습니다. AJAX 호출을 작성하고 콜백을 등록하면 실행시 다른 AJAX 호출을 작성하고 콜백 등을 등록합니다. 호출이 비동기가 아닌 동기식 인 경우 단일 어휘 범위에있는 일련의 코드 일뿐입니다. . 다시 한 번, 몇 줄의 직선 코드를 함수로 추상화하지 않을 것입니다.

문화적 요소가 있으며, 위와 같은 이유로 인해 익명 함수는 다른 많은 언어보다 JavaScript에서 훨씬 일반적이며 다른 많은 언어보다 편안하고 느슨하게 사용됩니다.


C ++ 코딩의 내 자신의 순진한 구조는 때로는 std :: function 및 lambdas를 통해 JavaScript에서 이벤트 기반 코딩 및 콜백의 원칙을 취했습니다. 필자의 경우 C ++에서 UI 코드를 수행하고 차단 작업을 수행하고 싶지 않기 때문에 부분적으로 발생합니다. 언어가 잘 지원하는 한 JavaScript의 관행이 누구에게나 유용한 지 궁금합니다.
Katana314
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.