2012-05-12 2 views
0

JavaScript에서 개인 전역 변수를 만드는 방법이 있습니까? 나는 주변을 둘러 보려고 노력했으며, 너무 보편적이지 않은 생성자에 대한 이야기를 계속하고 있습니다. 자바 스크립트에서 접근 수정이없는 귀하의 질문에 대답하려면자바 스크립트에서 전역 개인 변수를 만드는 방법은 무엇입니까?

감사

+7

"개인 전역 변수"란 무엇을 의미합니까? 예제를 제공해 줄 수 있습니까? –

+2

"글로벌 변수가 아닌 글로벌 변수"라고 말하는 것과 비슷합니까? – Joseph

+0

즉각적인 기능에 대해 알고 싶습니다. http://stackoverflow.com/questions/8475578/what-is-the-reason-for-this-javascript-immediate-invocation-pattern –

답변

2

사용 사례가 무엇인지 잘 모릅니다. 일부 함수와 변수를 포함하는 js 스크립트 파일이 있다고 가정하고 그 중 일부를 전역으로 노출하지만 나머지는 스크립트 파일에 비공개로 유지하고 싶습니다. 클로저로이를 수행 할 수 있습니다. 기본적으로 즉시 실행하는 함수를 만듭니다. 함수 내에서 원래 코드를 배치합니다. 그런 다음 필요한 기능을 전역 범위로 내 보냅니다.

// Define a function, evaluate it inside of parenthesis 
// and execute immediately. 
(function(export) { 

    var myPrivateVariable = 10; 

    function myPrivateFunction(param) { 
    return param + myPrivateVariable; 
    } 

    export.myGlobalFunction = function(someNumber) { 
     return myPrivateFunction(someNumber); 
    }; 
})(this); // The *this* keyword points to *window* which 
      // is *the* global scope (global object) in a web browser 
      // Here it is a parameter - the *export* variable inside the function. 

// This is executed in the global scope 
myGlobalFunction(2); // yields 12 (i.e. 2 + 10) 
myPrivateVariable; // Error, doesn't exist in the global scope 
myPrivateFunction(2) // Error, doesn't exist in the global scope 
1

은, 아니, 그건 불가능합니다. 전역 범위에서 선언 된 변수는 모든 함수에서 액세스 할 수 있습니다.

이 답변에 대한 의견에서 지적한 것처럼 비공개 멤버가있는 개체를 만들 수 있습니다. Crockford는 private members in Javascript에 관한 페이지를 가지고 있습니다. 그는 자신의 포인트 설명하기 위해 다음 코드를 사용하여 위의 예에서, PARAM, 비밀을

function Container(param) { 

    // private method 
    function dec() { 
     if (secret > 0) { 
      secret -= 1; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    this.member = param; 
    var secret = 3; 
    var that = this; 

    // privileged method 
    this.service = function() { 
     return dec() ? that.member : null; 
    }; 
} 

를, 그리고 모든 개인 것을 그들은 외부에서 액세스 할 수 없습니다. 좀 더 명확히 말하자면,이 변수는 특권이있는 메소드 나 개인 메소드에 의해서만 액세스 될 수 있습니다. 차이점은 특권 메소드가 오브젝트의 모든 인스턴스에서 호출 될 수 있다는 점입니다. 주석에서 제안 된 것처럼 클로저를 사용하여이 작업을 수행 할 수 있습니다.

폐쇄에 대한 간단한 설명은 Crockford의 말을 참고하십시오. 그러나 related questions을 많이 찾을 수 있습니다. 이것이 의미

이너 함수는 항상 외부 함수가 리턴 후에도 VARS 및 외부 함수의 매개 변수에 대한 액세스를 갖는다는 것이다.

+1

... 본질적으로 [closure 비공개] 변수를 만들 수 있다는 것을 제외하고는 (http://phrogz.net/js/Classes/OOPinJS.html). – Phrogz

+1

@Phrogz 물론 그렇게 할 수 있지만 개인 값을 포함하는 실제 변수를 전역 범위에 포함시킬 수는 없습니다. – Radu

+0

정확함; 나는 원래 대답의 첫 번째 문장에 대해서만 논평했다. :) – Phrogz

관련 문제