2014-07-25 3 views
1

기능이 있다고 가정 해 보겠습니다.기능 개체에 속성을 첨부해도 안전합니까?

function foo() { 
    var bar = true; 
    if(bar) { 
     //Do x 
    } 
} 

이 예에서 bar은 정규 표현식과 같은 일부 조건입니다. 전 세계적으로 액세스 할 수 있기를 원합니다. 따라서 조건을 변경하고 foo()을 다시 실행할 수 있습니다.

var foo_options = { 
    bar: true 
}; 

function foo() { 
    if(foo_options.bar) { 
     //Do x 
    } 
} 

foo(); 
foo_options.bar = false; 
foo(); 

내가 싶습니다 :

var bar = true; 

function foo() { 
    if(bar) { 
     //Do x 
    } 
} 

foo(); 
bar = false; 
foo(); 

또는 함수에 인수 :

function foo(bar) { 
    if(bar) { 
     //Do x 
    } 
} 

foo(true); 
foo(false); 

또는 별도의 전역 객체 나는 그것을 전역 변수를하여이 작업을 수행 할 수 하나의 전역 변수를 만들어서 조건을 유지하는 것을 피하십시오. 불필요하게 불필요하게 혼란 스럽기 때문에 전역 변수 (실제로는 잘 명명 된 경우에도)가 실제로 한 곳에서만 사용되는 것을 보유하게 만듭니다. 이 함수는 여러 번 호출 될 것이고 실제로 함수가 호출 된 인수를 제어 할 수 없기 때문에 조건을 인수로 전달할 필요가 없습니다. 글로벌 객체는 글로벌 변수와 비슷한 이유 때문에 불필요한 것처럼 보이지만 매우 까다 롭습니다. 나는 '

function foo() { 
    if(foo.bar) { 
     //Do x 
    } 
} 
foo.bar = true; 

foo(); 
foo.bar = false; 
foo(); 

: 나는 현재 foo() 기능을하기 때문에 자바 스크립트 객체로 함수 (문자열이나 숫자가 아닌 다른 거의 모든)를 처리하는 방법의 수 속성을주는 고려하고

이것을 시험해 볼 수는 있지만 어떤 식 으로든 좋은 생각인지 위험한 지에 대해서는 우려하고 있습니다. 조언?

+0

가끔은 끝났지 만 가장 자주 변수를 클로저에 정의 할 수 있습니다. –

+2

기존 속성을 덮어 쓰지 않는 한 ... –

+1

OP, 답변을 작성했습니다. 유용하다고 생각하지 않습니다. 그렇지 않다면 제거하겠습니다. –

답변

2

기본 개체에 속성을 추가하는 경우가 종종 발생하지만 표준 속성 (예 : length)을 바꾸지 않는다면 문제가되지 않습니다.

청소기 솔루션은 기능 팩토리를 사용하여 변수를 저장하는 클로저를 사용하는 것입니다

function makeFoo(foo_options){ 
    return function(){ 
     console.log("bar : ", foo_options.bar); 
    } 
} 
var foo1 = makeFoo({bar:3}), 
    foo2 = makeFoo({bar:0}); 
foo1(); // logs bar : 3 
foo2(); // logs bar : 0 

추가 된 장점은 서로 다른 옵션을 몇 가지 기능을 간단히을 가질 수 있다는 것입니다.

1

함수와 변수를 단일 객체에 바인딩 할 수 있습니까? 안전하고 기본 개체를 수정하지 않습니다.

var myObject = { 
    foo : 1234, 
    bar : function(){ 
     console.log(this.foo) 
    } 

} 

myObject.bar(); 
0

이 문제에 대해 함수 팩터 리는 이미 제안 된 것처럼 가장 쉽고 가장 의미있는 해결책 일 수 있습니다. 옵션을 변경하려고 할 때마다 새 함수를 만드는 함수 팩터 리가 아닌 "싱글 톤"을 선호하는 다른 해결책은 반환 할 "인터페이스 객체"가있는 클로저를 사용하는 것입니다.

var Foo = (function() { 
    var bar = true; 

    function foo() { 
    if(bar) { 
     //Do x 
    } 
    } 

    return { 
    setBar: function(b) { 
     bar = b; 
    }, 
    getBar: function() { 
     return bar; 
    }, 
    foo: foo 
    }; 
}()); 

Foo.setBar(false); 
Foo.foo(); 
관련 문제