2011-09-21 2 views
3

난 항상 이런 식으로 함수 프로토 타입 선언을 작성하는 데 사용했다 :함수 프로토 타입을 이와 같이 작성하는 방법이 있습니까?

var O = function() {}; 
O.prototype.fn = function() {} 

그러나이 방법으로 일부 개발자 쓰기 :

var O = function() {}; 
O.prototype.fn = function fn() {} 

이 방법은 동일? 그렇지 않은 경우 두 번째 방법을 사용하면 어떤 이점이 있습니까?

var O = function() {}; 
O.prototype.fn = function fn() {} 

답변

4

var a = function _a() { }

,

var a = function() { }

명명 된 함수 표현식이라고 전자 대 후자는 단지 기능 할당입니다.

NFE 두 장점

  • 그것은 스택 트레이스에 도시 된 이름을 가지고있다. 이것은

NFE는 단점이 재귀의 함수 내에서 사용할 수있는 이름이있다 상당히 디버깅

  • 향상시킵니다. Kangax talks about them in depth.

    개인적으로 나는 어디에서나 NFE를 사용하고 IE가 만드는 메모리 누수를 무시합니다. 그러나 IE는 이러한 함수 이름을 전역 범위로 누출하므로이를 고유하게 만들기위한 노력이 필요합니다.

    IE는이 이름을 전역 범위로 누출하는 습관을 가지고 있기 때문에 고유하게 만듭니다. 내가

    // prototype object 
    var O = { 
        fn: function _fn() { } 
    }; 
    // factory 
    var o = function _o() { return Object.create(O); } 
    
    var obj = o(); 
    
  • +1

    "NFE를 어디에서나 사용하고 버그를 무시합니다." "IE는이 이름들을 글로벌 범위로 누출시키는 버릇이 있습니다. ? – katspaugh

    +0

    @katspaugh는 "ignore the bugs"에 의해 IE가 메모리 누출에 신경 쓰지 않음을 의미합니다. NFE를 피하는 가장 큰 이유는 메모리 누수 때문입니다. IE에 대해 정말로 신경 쓰면'var a = function _a() {};와 같은 코드를 작성할 것입니다. {delete _a; } catch (e) {/ * 나는 IE * /}를 싫어한다.네 말이 맞아, 내가 의미 한 바를 다시 분명히 했어 – Raynos

    +0

    예, 지금 보입니다. 손으로 고유 한 이름을 만들어서 이름 충돌을 해결하는 것은 메모리 누수를 신경 쓰지 않는 것과 같습니다. 승인. – katspaugh

    0

    당신은 익명 함수를 만들 때 이름을 사용하는 경우, 당신은 함수 내에서 그 이름을 사용할 수 있습니다

    var x = function y() { 
        y(); // here it exists 
    } 
    
    y(); // here it doesn't exist 
    

    그의 사용은 제한 물론이다. 재귀를 위해 또는 콜백 함수로 메소드를 연결하는 데 사용할 수 있습니다.

    +0

    '// 여기

    var O = function() {}; O.prototype.fn = function fn() {} var obj = new O(); 

    에 대한 대안 패턴이있다 사이드 참고로 _

    var doSomeLogic = function _doSomeLogic() { }; 

    와 함수 선언의 이름을 붙일 이유

    입니다 그것은 존재하지 않습니다'는 호환 브라우저에서만 유효합니다. IE는 글로벌 스코프로'y'를 유출하는 습관을 가지고 있습니다. – Raynos

    관련 문제