2010-08-11 3 views
22

자바 스크립트에서 익명 함수를 사용하는 것은 나쁜 습관입니다. 왜냐하면 디버깅을 어렵게 만들 수 있기 때문입니다. 자바 스크립트의 익명 함수는 정말 나쁜 습관입니까? 그렇다면 왜 그런가요?익명 함수는 JavaScript에서 나쁜 습관입니까?

+0

익명/람다 함수는 함수형 프로그래밍의 핵심 기능입니다. http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski

+0

개발자 도구 및 빌드/모듈 전략은 2010 년부터 _long_ 방식으로 변경되었습니다. Chrome/WebKit은 정말 훌륭합니다. FireBug 너무 작지만 적절하다. (그리고 함수 표현식의 이름은 시각적으로도 도움이된다.) 어쨌든, 사용 된 시간의 깎아 지른 수를 고려해 볼 때 이것은 모호한 공리입니다. 아마도 "너무 똑똑한"코드로 묶여서/따라 디버깅하기가 힘듭니다. 왜냐하면 _my_ 코드를 디버깅하는 데 고통을 느끼지 않았기 때문입니다. ;-) – user2864740

답변

12

아니요 익명의 익명 기능은 웹에서 JavaScript의 모든 곳에서 사용됩니다. 디버깅을 조금 더 어렵게 만들지 만, 사용해서는 안된다는 말은 아닙니다.

예를 들어, JQuery는이를 광범위하게 사용합니다.

범위를 제한하려는 경우와 같이 정식으로 선언 된 함수에 사용할 때가 많습니다.

+6

실제로 이것이 jQuery 사용을 중단 한 이유 중 하나입니다. 버그가 내 코드에서 구문 오류인지, 내 코드에서 논리적 오류인지 또는 jQuery 자체에서 문제가 있는지 판단하는 데는 항상 시간이 오래 걸렸습니다. 익명 함수의 호출 스택은 명명 된 함수 중 하나가 한눈에 알 수있는 것처럼 보이지 않게 만듭니다. – Kev

+6

[명명 된 함수 식] (http://yura.thinkweb2.com/named-function-expressions/#named-expr)을 언제든지 사용할 수 있습니다. –

7

반대로 람다 (별칭)는 좀 더 간결한 표현을 만듭니다. 여러 이벤트 핸들러를 여러 이벤트 핸들러에 바인딩하는 경우 각 이벤트 핸들러에 함수 이름을 지정하는 것이 지루할 수 있습니다.

디버깅을 조금 더 어렵게 만들더라도 도움이되고 시간을 절약 할 수 있지만 함수가 익명이기 때문에 디버깅에 거의 어려움이 없습니다. 코딩 할 때 JSLint를 사용하여 쉽게 작업을 수행해야합니다.

5

거의 확실하게, 람다 함수는 곳곳에 을 사용합니다. 거의 유비쿼터스입니다.

+16

무엇인가가 _common_ 인 것만으로 그것이 _correct_라는 것을 의미하지는 않습니다. 익명의 함수를 사용하는 데는 아무런 문제가 없지만 "모두가하는 일"이라고하는 것은 유효한 인수가 아닙니다. –

+0

깊게 중첩 된 새시가 모든 곳에서 있지만 완전히 잘못되었습니다. –

-3

익명 함수 표현식은 이며 JavaScript는입니다.

+3

지원 부족으로 인해 클레임이 거부되었습니다. – user2864740

+4

WHY가 부족하기 때문에 Downvoted. 또한 * common * practice가 반드시 * best * practice가 아니기 때문에. –

4

그냥 모두가 사용하기 때문에 좋은 연습을하지 못합니다. 모두 요소를 사용하여 레이아웃을 기억하고 계십니까?). 그러나 코드를 명확히하고 단순화하는 데 도움이 될 수 있으므로 문제가 발생할 가능성이 적습니다.

그러나 익명의 함수가 너무 복잡해서 디버깅이 어려워서는 안됩니다. 이 경우 새로운 기능을 만드는 것이 더 나을 것입니다.

+3

[명명 된 함수 표현식] (http://yura.thinkweb2.com/named-function-expressions/#named-expr)을 언제든지 사용할 수 있습니다. –

+3

+1 코드 작성을위한 +1 –

+1

@MarcelKorpel : 당신이 제공 한 링크가 죽었 습니다만, 다음과 같이 익명의 함수에 이름을 추가 할 수 있습니다 (더 이상 익명으로 만들지는 않습니다) :'var fAnonymous = (function nonAnon) {});'. 이것은 확실히 디버깅에 도움이 될 수 있습니다. – palswim

8

나는 여기에 약간의 흐름을 거슬러 올라가 익명의 기능이 실제로 널리 사용 되더라도 나쁜 습관이되는 경우를 만들려고한다.

1) 익명의 기능을 재사용 할 수 없습니다.

2) 익명 함수는 정의상 이름이 없으므로 익명 함수가하는 일을 설명하지 않습니다. 어느 것이 코드가 자체 문서화가 아니라는 것입니다.

3) 익명 함수는 단위 테스트 프레임 워크와 함께 단독으로 테스트 할 수 없습니다.

4) 저는 개인적으로 코드를 읽고 디버그하기가 더 어렵다고 생각합니다. 귀하의 경험은 다를 수 있지만.

익명의 기능이 최선의 선택이고 위의 단점을 피하기 위해 일반적으로 내 기능의 이름을 지정하는 경우가 있다고 생각합니다.

// Bad 
poopy = function(){} 
// function(){} 
groupy = poopy; 
// function(){} 

// Good 
droopy = function loopy(){}; 
// function loopy(){} 
floupy = droopy; 
// function loopy(){} 

것은 당신이 뭔가를 디버깅하고 groupy라는 함수 이름이 상상 :

+2

1) 익명 함수 및 클로저는 다시 사용할 수 있으며 모든 함수는 값이며 변수에 할당되거나 함수 인수로 제공 될 수 있습니다. 올바른 수준/범위와 같은 함수 객체를 노출하기 만하면됩니다. 2) 익명 함수 (또는 함수 표현식)는 명시 적 이름을 가질 수 있지만 문맥에서 "익명"입니다. 3) 테스트 대상, 테스트 방법 및 함수 개체가 노출되는 방식에 따라 다릅니다. 4) Closures/lambda는 "너무 많은 영리함"사례에서 학대 당할 수는 있지만 대부분의 사소한 절차 코드 문구가 있더라도 _ 코더는 끔찍한 코드 작성자입니다. – user2864740

+0

여기서 말하는 내용에 혼란 스럽습니다. 함수에 이름을주고 변수에 할당하면 익명 함수가 아닌 정의에 따라 함수를 할당 할 수 있습니까? 익명의 예를 들어 줄 수 있습니까? – bhspencer

+0

문제는 "익명"기능은 거짓말이라는 것입니다. 실제 용어는 * function expression * 또는 * closure * 또는 * lambda * (최상위 "function statement"또는 "method"와는 다릅니다)이어야합니다. * some * 이름이없는 "익명"함수 (IIFE 제외)를 사용하려면 어떻게해야합니까? – user2864740

0

여기 내 브라우저 콘솔입니다. 그것에 대한 자세한 정보를 얻으려면 이름을 입력하십시오.이 함수가 잘못된 섹션 에서처럼 설정되면 원래 선언이 무엇인지 알 수 없습니다. 그러나 Good 섹션 에서처럼 함수 이름을 정의하면 항상 원래 함수 이름의 흔적이 생깁니다.

관련 문제