2014-01-29 4 views
-2

자바 스크립트에는 두 가지 패턴이 있으며, 하나를 사용하는 것의 이점과 다른 것을 사용하는 것이 장점입니다.반환 함수와 반환 객체

var returnFunction = function(name,age){ 
    var n = name; 
    var a = name; 
    return function(){ 
    anotherFunc : function(){}, 
    oneMoreFunc : function(){} 
    } 
} 

내가 private 변수 이름과 나이에 두 가지 이상의 기능을 포함하는 기능 및 액세스를 반환 : 예를 들어, 함수를 반환 대 객체를 반환의 차이점은 무엇입니까. returnfunction을 호출 할 수 있다는 것을 알고 있으며, 생성자처럼 사용할 수 있다는 것을 알고 있습니다. 성능 저하가 있습니까

var returnObject = function(name,age){ 
    var n = name; 
    var a = age; 
    return { 
    anotherFunc:function(){}, 
    oneMoreFunc:function(){}, 
    }; 
} 
  • : 나는 대이 스타일의 장점이 무엇인지 알고 싶어?
  • 스타일에 불과합니까?
  • 하나 또는 다른 혜택이 있습니까 아니면 그냥 이것을 overthink 오전?

편집 : 옵션 A와 관련하여

, 내가 자바 스크립트에서이 특정 구문을 참조했다 : A는이 구문을 복제하는 의미 인위적인 예였다 좋은 부품

Function.prototype.method = function(name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

String.method('deentityify', function() { 

    // The entity table. It maps entity names to 
    // characters. 

    var entity = { 
     quot: '"', 
     lt: '<', 
     gt: '>' 
    }; 

    // Return the deentityify method. 

    return function() { 

     // This is the deentityify method. It calls the string 
     // replace method, looking for substrings that start 
     // with '&' and end with ';'. If the characters in 
     // between are in the entity table, then replace the 
     // entity with the character from the table. It uses 
     // a regular expression (Chapter 7). 

     return this.replace(/&([^&;]+);/g, 
      function(a, b) { 
       var r = entity[b]; 
       return typeof r === 'string' ? r : a; 
      } 
     ); 
    }; 
}()); 

옵션 .

+0

당신이 반환 된 객체에 개입을하려는 경우

는하지만, 옵션 A를하는 것보다 더 나은, 그리고, 그것은 그것을 클래스를 만들기 위해 단지 더 좋아 'functions'는'object'를 호출하는 것보다 더 많은 자원을 항상 먹습니다. –

+5

첫 번째 작동하지 않습니다. 아무것도하지 않고 두 개의 함수를 더 정의하고 버리는 함수를 반환합니다. –

+0

@ NicholasHazel 함수가 객체에 있다면? – Julio

답변

1

변형 A가 작동하지 않습니다. 구문 오류입니다.

그래서 당신이 정말로 비교하는지 :

var returnFunction = function(name,age){ 
    var n = name; 
    var a = name; 

    // return a function that returns 
    return function(){ 

     // logic to construct the object 
     var obj = { 
      anotherFunc : function(){}, 
      oneMoreFunc : function(){} 
     } 

     // return the object 
     return obj; 
    } 
} 

// vs. 
var returnObject = function(name,age){ 
    var n = name; 
    var a = age; 

    // return the object directly 
    return { 
     anotherFunc:function(){}, 
     oneMoreFunc:function(){}, 
    }; 
} 

이 같은 객체 보는가에 따라 달라집니다.

대부분의 경우 B 옵션을 사용합니다. 간단한 개체 만 반환하면됩니다. 나는 V8 이외의 아무것도 몰라,하지만 V8에는 다음과 같습니다

-> 새 범위 -> 일부 바르를 할당 -> 그 기능 의 코드를 컴파일 -> 함수 을 만들 - > 범위를 닫 함수를 반환 -> 기능을 실행 -> 새 범위 -> 개체를 만드는 -> 범위를, 객체를 돌려 닫습니다

-> 새 범위 -> assi gh 일부 바늘 -> 객체를 생성하십시오. -> 객체를 반환하고 범위를 닫으십시오.

분명히 첫 번째 단계는 더 많은 단계가 있지만 속도 차이는 중요하지 않습니다.

그러나 여러 중첩 된 속성과 초기화해야하는 기본 함수가있는 복잡한 개체를 반환하는 것은 단순히 비현실적인 경우가 있습니다. 객체를 생성하고 필요에 따라 반환하는 것이 훨씬 더 유용한 경우. A. 옵션입니다.당신은 더 많은 읽을 수 있습니다 여기에

var returnObjectClass = function(name,age){ 
    this.name = name; 
    this.class = class; 
    this.anotherFunc = function(){}; 
    this.oneMoreFunc = function(){}; 
    return this; 
} 

: http://www.phpied.com/3-ways-to-define-a-javascript-class/

+0

자바 스크립트에는 클래스가 없습니다. * returnObjectClass *가 생성자로 호출되는 경우 이름의 대문자로 시작하는 것이 일반적입니다. 함수는 * new *로 호출 할 때 생성자 일 뿐이므로 기본적으로 * this *를 반환하므로 return 문이 필요하지 않으므로이를 포함하지 않아야합니다. 'this.anotherFunc : function() {};'은 this.anotherFunc = function() {};'일 것이지만, 메소드는 생성자의 프로토 타입에 있어야한다. 그렇지 않으면 그냥 객체 일 뿐이다. – RobG

+0

당신이 말한 모든 것이 옳습니다. 나는 지금 바로 잡는다. –