2011-03-24 7 views
2

나는 이것을 처리하기 위해 내 머리를 찢어 버리고있었습니다 ... 특히 html5 탐지 스크립트의 경우. 한 번만 설정되고 다시 덮어 쓸 수없는 변수를 원했습니다. 이것은이다 :한 번만 설정되는 자바 스크립트의 정적 변수

var StaticConfiguration = {}; 
StaticConfiguration.Main = { 
    _html5: null 
} 
StaticConfiguration.getVariable = function(name) { 
    return StaticConfiguration.Main["_" + name]; 
} 
StaticConfiguration.setVariable = function(name, value) { 
    if(StaticConfiguration.Main["_" + name] == null) { 
     StaticConfiguration.Main["_" + name] = value; 
    } 
} 

첫째, 나는이 모든 변수를 포함하는 전역 객체의 StaticConfiguration을 정의 - 내 경우, 그냥 "HTML5". 나는 그것을 애플리케이션 내부에 설정하고자하므로 null로 설정한다. 그렇게하려면 전화 :

설정되었습니다. 다시 설정하려고하면 _html5가 더 이상 null이 아니기 때문에 실패합니다. 그래서 나는 실제적으로 밑줄을 사용하여 정적 변수를 숨 깁니다.

이것은 나를 많이 돕고 있습니다. 나는 그것이 좋은 접근 방법이되기를 바랍니다. - 그렇지 않으면 말해주세요. :)

+0

가 어떤 상황이 변수가 덮어 얻을 것이다 파티에하지만,이 같은 상황에서 조금이야 알아? 어쨌든 탐지 스크립트는 한 번만 실행된다고 생각합니까? –

+0

잘 확인하지 않고 쉽게 할 수 있습니다 StaticConfiguration.setVariable ("html5", "bla"); StaticConfiguration.setVariable ("html5", "boom"); StaticConfiguration.setVariable ("html5", "bang"); ... 변수가 항상 설정됩니다. 즉, 피하고 싶었던 것이 있습니다. –

답변

5

첫째로, 그것은 문자열 "false" 포함 true로 평가하지 "true"(떨어져 빈 문자열에서) 모든 문자열, true입니다.

둘째로, 정말 이런 데이터를 보호해야합니까? 어쨌든 사용자의 Javascript를 안전하게 실행하는 방법은 없습니다. 이런 식으로 보호 할 수있는 방법이 항상 있습니다. 문제가되는 코드가 실제로 신경 쓰이는 경우, 어쨌든 StaticConfiguration 개체 전체를 바꿀 수 있습니다.

Matthew의 코드는 문제에 대한 더 나은 접근 방법이지만 싱글 톤 패턴을 따르지는 않지만 인스턴스화해야하는 클래스입니다. "정적"변수를 가진 단일 객체를 원한다면이 방법을 사용하면됩니다.

StaticConfiguration = new (function() 
{ 
    var data = {} 
    this.setVariable = function(key, value) 
    { 
    if(typeof data[key] == 'undefined') 
    { 
     data[key] = value; 
    } 
    else 
    { 
     // Maybe a little error handling too... 
     throw new Error("Can't set static variable that's already defined!"); 
    } 
    }; 

    this.getVariable = function(key) 
    { 
    if (typeof data[key] == 'undefined') 
    { 
     // Maybe a little error handling too... 
     throw new Error("Can't get static variable that isn't defined!"); 
    } 
    else 
    { 
     return data[key]; 
    } 
    }; 
})(); 

개인 (!) 참고 : 나는 열정으로 서식은 "자신의 라인에 중괄호"싫어 !

+0

-1. 새 객체를 만들지 않으므로 이것은 '창'입니다. –

+0

지적 해 주셔서 고맙습니다. 결정된. – nitro2k01

+0

정말 대단합니다. 고마워. 나는 또한 싱글 톤 (네임 스페이스)에 물건을 넣는 것을 선호하기 때문에 이것이 나를위한 완벽한 해결책이다. –

1

Private Members in JavaScript에 관한 Crockford의 기사를보십시오. 당신은 같은 것을 할 수 있습니다

var StaticConfiguration = (function() { 
    var html5; /* this is private, i.e. not visible outside this anonymous function */ 

    return { 
    getVariable: function(name) { 
     ... 
    }, 

    setVariable: function(name, value) { 
     ... 
    } 
    }; 
)(); 
1

방법에 대해 : 다른 대답 유사

var StaticConfiguration = new (function() 
{ 
    var data = {} 
    this.setVariable = function(key, value) 
    { 
    if(typeof data[key] == 'undefined') 
    { 
     data[key] = value; 
    } 
    }; 

    this.getVariable = function(key) 
    { 
    return data[key]; 
    }; 
})(); 

,하지만 여전히 임의의 키를 할 수 있습니다. 이것은 언더 스코어 솔루션과 달리 진정으로 사적입니다.

1

필자는 데이터를 덮어 쓰지 않도록이 정도로 이동해야한다고 생각하는 이유에 대해 조금 궁금합니다. 브라우저를 검색하는 경우 한 번만 실행하면 안됩니까? 누군가가 유효하지 않은 데이터로 덮어 쓰는 경우 라이브러리 구현이 아니라 라이브러리 구현에서 문제가 될 것이라고 생각합니다.

부수적으로, KISS 원칙, , 특히에서 클라이언트 측 스크립팅에 관해서는 꽤 큽니다.

+0

내가 작성한 것처럼 변수가 한 번 또는 전혀 설정되지 않았다는 것이 중요했습니다. 브라우저 검색이 한 번만 수행되어야합니다. 다른 것들 (GET 변수)은 다를 수 있습니다. 또 다른 클래스 (다른 개발자의 문제)가 점프하여 동일한 변수를 다시 설정하려고 할 수도 있습니다. 맞습니다. 이러면 안되지만 내 의도는 일종의 '안전한'것입니다. –

0

나는 내가 늦게 나는 보통에서

var data; 

if (data === undefined || //or some other value you expect it to start with{ 
data = "new static value" 
};