2012-01-17 3 views
60

함수를 객체를 정의하는 대신 (따라서 전역 적으로) 객체에 저장하는 것은 잘못된 코딩 방법으로 간주됩니까?자바 스크립트 - 개체에 함수 저장 - 나쁜 습관?

고려 :

1.

Foo = { 
    bar: function() { 
     alert("baz"); 
    } 
} 

Foo.bar();

2.

function bar() { 
    alert("baz"); 
} 

bar();

확실히 두 번째 예제에서는 코드가 약간 적지 만 많은 기능을 시작하면 지저분해질 수 있습니다. 나는 방법, 방법, 청소기, 예를 들어, 사용 Game.update() 대신 updateGame(); 또는 유사합니다. Game.notify.admin(id)과 같이 깊어지면 코드가 훨씬 더 멋지게됩니다.

개체에 함수를 저장하면 단점이 있습니까?

+2

아니요. 전세계에 수백만 명의 사용자가있는 프레임 워크는 그렇게하지 않을 것입니다. – Jon

+2

아니요. 귀하의 질문이 이미 지적한대로 지구의 오염을 피하기위한 표준 네임 스페이스입니다. 왜 그렇게 나쁠까요? –

답변

56

첫 번째 방법이 바람직합니다. 이렇게하면 전역 범위를 오염시키는 대신 함수의 범위를 명시 적으로 정의합니다. 첫 번째 접근법을 사용할 때의 단점은 없습니다. 단점 :-)

결론 : 항상 함수를 정의하는 첫 번째 방법을 사용하십시오. 두 번째는 90 년대 자바 스크립트와 같습니다. 과거에는 평온함을 유지하고 적절한 범위 지정을 사용합시다.

+1

적극적으로 중첩 할 경우 몇 가지 단점이 있습니다. _functions_을 "더 좋기 때문에"객체에 넣는 것은 어리석은 짓입니다. (글로벌 스코프에 함수를 두는 것도 어리 석다.하지만 그것은 모듈 스코프를 가정 한 것과는 다르다.)또한 네 개의 레이어를 넘는 오브젝트 및 기능을 중첩하면 바보가됩니다. 이상적으로는 객체/메소드 체인'foo.bar.baz()'에 대해 하나 또는 두 개의 레이어가 필요합니다. – Raynos

+2

정말 범위에 관한 것입니까? 아니면 중복 변수 이름의 가능성을 줄이기 위해 전역 변수의 수를 줄이는 것입니다. "지구 환경 오염"은 ** 어떤 다른 부작용이 있습니까? – RobG

+0

@RobG 유지 관리. 전역 변수의 수를 0으로 줄이려고 시도 할 충분한 이유가 있습니다. – Raynos

3

이 특별한 경우에는 첫 번째 것으로 이동하십시오. 그러나 Foo 객체가 실제로 복잡해지면 생성자를 사용할 수있는 또 다른 접근 방식을 사용하는 것이 좋습니다. 이 공간 객체와 마법하지 않으며, 당신이 전역 변수를 많이 사용하는 경우 반드시 어떤 문제가있을 것

function Foo(appName){ 
    this.name = appName;  
} 

Foo.prototype.Bar = function(){ 
    alert(this.name) 
} 

var a = new Foo("baz"); 
a.Bar(); 
+0

안티 패턴이 감지되었습니다. 프로토 타입을 사용하십시오. 고맙습니다. – Raynos

+0

당신의 권리 @ 레이노 스는 함수 내부에서 함수를 선언 할 때 문제는 클래스를 시작할 때마다 다시 생성된다는 것입니다. –

4

:이 함수의 범위에 관해서 또한 첫 번째 방법은 때때로 최선이 아니다. "네임 스페이스"개체를 사용하는 주된 이유는 중복 된 전역 변수 이름의 가능성을 줄이는 데 있습니다. 물론

// Global variable example: 
myLib_dom_someDOMFunction0; 
myLib_dom_someDOMFunction1; 

myLib_util_someUtilityFunction0; 
myLib_util_someUtilityFunction1; 

는 전자는 일반적으로 다음 위에서 유사하게 글로벌 변수로 중복 실질적으로 동일한 기회를 가지고

// Object example (suggested best practice): 
// DOM functions are under myLib.dom 
myLib.dom.someDOMFunction0; 
myLib.dom.someDOMFunction1; 

// Utility functions are under myLib.util 
myLib.util.someUtilityFunction0; 
myLib.util.someUtilityFunction1; 

참고 : 두 번째 이유는 함께 편리 성, 예를 들어 대한 그룹 유사한 기능이다 선호하기 때문에 작업하기 쉽다. 나는 글로벌 변수를 많이 생성하는 문제가 있지만 소위 "글로벌 네임 스페이스 오염"이 위험 요소로 과대 평가된다는 점을 지적하면서 두 번째 방법을 채택하는 것을지지하지 않습니다. 첫 번째 방법을 사용합니다.