자바 스크립트에서 익명 함수를 사용하는 것은 나쁜 습관입니다. 왜냐하면 디버깅을 어렵게 만들 수 있기 때문입니다. 자바 스크립트의 익명 함수는 정말 나쁜 습관입니까? 그렇다면 왜 그런가요?익명 함수는 JavaScript에서 나쁜 습관입니까?
답변
아니요 익명의 익명 기능은 웹에서 JavaScript의 모든 곳에서 사용됩니다. 디버깅을 조금 더 어렵게 만들지 만, 사용해서는 안된다는 말은 아닙니다.
예를 들어, JQuery는이를 광범위하게 사용합니다.
범위를 제한하려는 경우와 같이 정식으로 선언 된 함수에 사용할 때가 많습니다.
실제로 이것이 jQuery 사용을 중단 한 이유 중 하나입니다. 버그가 내 코드에서 구문 오류인지, 내 코드에서 논리적 오류인지 또는 jQuery 자체에서 문제가 있는지 판단하는 데는 항상 시간이 오래 걸렸습니다. 익명 함수의 호출 스택은 명명 된 함수 중 하나가 한눈에 알 수있는 것처럼 보이지 않게 만듭니다. – Kev
[명명 된 함수 식] (http://yura.thinkweb2.com/named-function-expressions/#named-expr)을 언제든지 사용할 수 있습니다. –
반대로 람다 (별칭)는 좀 더 간결한 표현을 만듭니다. 여러 이벤트 핸들러를 여러 이벤트 핸들러에 바인딩하는 경우 각 이벤트 핸들러에 함수 이름을 지정하는 것이 지루할 수 있습니다.
디버깅을 조금 더 어렵게 만들더라도 도움이되고 시간을 절약 할 수 있지만 함수가 익명이기 때문에 디버깅에 거의 어려움이 없습니다. 코딩 할 때 JSLint를 사용하여 쉽게 작업을 수행해야합니다.
거의 확실하게, 람다 함수는 곳곳에 을 사용합니다. 거의 유비쿼터스입니다.
무엇인가가 _common_ 인 것만으로 그것이 _correct_라는 것을 의미하지는 않습니다. 익명의 함수를 사용하는 데는 아무런 문제가 없지만 "모두가하는 일"이라고하는 것은 유효한 인수가 아닙니다. –
깊게 중첩 된 새시가 모든 곳에서 있지만 완전히 잘못되었습니다. –
익명 함수 표현식은 이며 JavaScript는입니다.
지원 부족으로 인해 클레임이 거부되었습니다. – user2864740
WHY가 부족하기 때문에 Downvoted. 또한 * common * practice가 반드시 * best * practice가 아니기 때문에. –
그냥 모두가 사용하기 때문에 좋은 연습을하지 못합니다. 모두 표 요소를 사용하여 레이아웃을 기억하고 계십니까?). 그러나 코드를 명확히하고 단순화하는 데 도움이 될 수 있으므로 문제가 발생할 가능성이 적습니다.
그러나 익명의 함수가 너무 복잡해서 디버깅이 어려워서는 안됩니다. 이 경우 새로운 기능을 만드는 것이 더 나을 것입니다.
[명명 된 함수 표현식] (http://yura.thinkweb2.com/named-function-expressions/#named-expr)을 언제든지 사용할 수 있습니다. –
+1 코드 작성을위한 +1 –
@MarcelKorpel : 당신이 제공 한 링크가 죽었 습니다만, 다음과 같이 익명의 함수에 이름을 추가 할 수 있습니다 (더 이상 익명으로 만들지는 않습니다) :'var fAnonymous = (function nonAnon) {});'. 이것은 확실히 디버깅에 도움이 될 수 있습니다. – palswim
나는 여기에 약간의 흐름을 거슬러 올라가 익명의 기능이 실제로 널리 사용 되더라도 나쁜 습관이되는 경우를 만들려고한다.
1) 익명의 기능을 재사용 할 수 없습니다.
2) 익명 함수는 정의상 이름이 없으므로 익명 함수가하는 일을 설명하지 않습니다. 어느 것이 코드가 자체 문서화가 아니라는 것입니다.
3) 익명 함수는 단위 테스트 프레임 워크와 함께 단독으로 테스트 할 수 없습니다.
4) 저는 개인적으로 코드를 읽고 디버그하기가 더 어렵다고 생각합니다. 귀하의 경험은 다를 수 있지만.
익명의 기능이 최선의 선택이고 위의 단점을 피하기 위해 일반적으로 내 기능의 이름을 지정하는 경우가 있다고 생각합니다.
// Bad
poopy = function(){}
// function(){}
groupy = poopy;
// function(){}
// Good
droopy = function loopy(){};
// function loopy(){}
floupy = droopy;
// function loopy(){}
것은 당신이 뭔가를 디버깅하고 groupy
라는 함수 이름이 상상 :
1) 익명 함수 및 클로저는 다시 사용할 수 있으며 모든 함수는 값이며 변수에 할당되거나 함수 인수로 제공 될 수 있습니다. 올바른 수준/범위와 같은 함수 객체를 노출하기 만하면됩니다. 2) 익명 함수 (또는 함수 표현식)는 명시 적 이름을 가질 수 있지만 문맥에서 "익명"입니다. 3) 테스트 대상, 테스트 방법 및 함수 개체가 노출되는 방식에 따라 다릅니다. 4) Closures/lambda는 "너무 많은 영리함"사례에서 학대 당할 수는 있지만 대부분의 사소한 절차 코드 문구가 있더라도 _ 코더는 끔찍한 코드 작성자입니다. – user2864740
여기서 말하는 내용에 혼란 스럽습니다. 함수에 이름을주고 변수에 할당하면 익명 함수가 아닌 정의에 따라 함수를 할당 할 수 있습니까? 익명의 예를 들어 줄 수 있습니까? – bhspencer
문제는 "익명"기능은 거짓말이라는 것입니다. 실제 용어는 * function expression * 또는 * closure * 또는 * lambda * (최상위 "function statement"또는 "method"와는 다릅니다)이어야합니다. * some * 이름이없는 "익명"함수 (IIFE 제외)를 사용하려면 어떻게해야합니까? – user2864740
여기 내 브라우저 콘솔입니다. 그것에 대한 자세한 정보를 얻으려면 이름을 입력하십시오.이 함수가 잘못된 섹션 에서처럼 설정되면 원래 선언이 무엇인지 알 수 없습니다. 그러나 Good 섹션 에서처럼 함수 이름을 정의하면 항상 원래 함수 이름의 흔적이 생깁니다.
- 1. 나쁜 습관입니까?
- 2. 이것은 나쁜 습관입니까? C++
- 3. 이것은 나쁜 습관입니까?
- 4. 나쁜 프로그래밍 습관입니까?
- 5. getters에서의 객체 생성은 나쁜 습관입니까?
- 6. $ _POST에 쓰는 것은 나쁜 습관입니까?
- 7. 긴 초기화 방법을 사용하는 것은 나쁜 습관입니까?
- 8. 익명 클래스가 나쁜 생각입니까?
- 9. NSArrayControllers를 프로그래밍 방식으로 사용하는 것은 나쁜 습관입니까?
- 10. AJAX를 통해 HTML을 생성하는 것은 나쁜 습관입니까?
- 11. python의 getattr을 광범위하게 사용하는 것은 나쁜 습관입니까?
- 12. static 클래스에 state를 두는 것은 나쁜 습관입니까?
- 13. 데이터 멤버에 직접 액세스하는 것은 나쁜 습관입니까?
- 14. 정적 필드를 사용하는 것은 나쁜 습관입니까?
- 15. 인자없이 puts를 호출하는 것이 나쁜 습관입니까?
- 16. 작업에 따라보기를 변경하는 것은 나쁜 습관입니까?
- 17. 참조가있는 동적 배열을 변경하는 것은 나쁜 습관입니까?
- 18. 이것은 나쁜 습관입니까? Multiple Graphics2D Objects
- 19. 변수를 더미 값으로 초기화하는 것은 나쁜 습관입니까?
- 20. 외래 키로 '뒤로 이동'하는 것은 나쁜 습관입니까?
- 21. MongoEngine 사용자 문서를 확장하는 것은 나쁜 습관입니까?
- 22. 자바 스크립트와 같은 익명 함수는
- 23. jQuery 래퍼에 객체를 작성해야할까요? 아니면 나쁜 습관입니까? (예제 내부)
- 24. JavaScript에서 자체 호출 함수는 무엇입니까?
- 25. 명명 된 함수는 JavaScript에서 과소 평가 되었습니까?
- 26. JavaScript에서 익명 함수에 인수를 전달하려면 어떻게해야합니까?
- 27. 익명 함수는 명령 패턴을 구현하는 좋은 방법입니까?
- 28. 여기서 호출 및 적용 함수는 JavaScript에서 정의됩니다.
- 29. Jars 내에 속성/구성 파일을 포함시키는 것은 나쁜 습관입니까?
- 30. 하나의 요청으로 여러 데이터베이스 연결을 만드는 것이 나쁜 습관입니까?
익명/람다 함수는 함수형 프로그래밍의 핵심 기능입니다. http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski
개발자 도구 및 빌드/모듈 전략은 2010 년부터 _long_ 방식으로 변경되었습니다. Chrome/WebKit은 정말 훌륭합니다. FireBug 너무 작지만 적절하다. (그리고 함수 표현식의 이름은 시각적으로도 도움이된다.) 어쨌든, 사용 된 시간의 깎아 지른 수를 고려해 볼 때 이것은 모호한 공리입니다. 아마도 "너무 똑똑한"코드로 묶여서/따라 디버깅하기가 힘듭니다. 왜냐하면 _my_ 코드를 디버깅하는 데 고통을 느끼지 않았기 때문입니다. ;-) – user2864740