2012-04-10 2 views
1

초보자 용 질문. 아마도 사소한 질문 일 것입니다.자바 스크립트 변수의 범위 (XUL 관련)

<window 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

    <script type="application/javascript" src="chrome://.../main.js"/> 

    <button label="Click me!" oncommand="clickhandler()"/> 
</window> 

자바 스크립트 코드 :

// main.js 

var test = "Peanut butter"; // a global variable 

function clickhandler() { 
    alert(test); 
} 

인터프리터 그냥 메인 윈도우의 시작 태그를 읽은 후 자바 스크립트 파일을 처리 한 후 XUL 코드의 나머지 부분과 진행 여기 XUL의 코드입니다. 제 의견으로는 test 변수는 인터프리터가 main.js 처리를 마치는 순간에 범위를 벗어나야합니다. 또한 clickhandler() 함수도 범위를 벗어나야합니다. 즉, 버튼을 클릭하면 아무 것도 나타나지 않아야합니다. 글쎄, 내가 예를 들어 document.testdocument.clickhandler()으로 선언하지 않는 한. 그러나, 간단한 실험은 틀린 나를 증명했다. 버튼을 클릭하면 함수와 변수가 모두 존재합니다. 이와 같이 선언 된 변수의 실제 수명은 얼마입니까? 그들이 언제 파괴 되었습니까? 신청서가 끝날 때까지 주변에 있습니까? 모범 사례 및 참고 문헌은 높이 평가됩니다.

+1

여기에 좋은 참고 자료가 있습니다. http://stackoverflow.com/questions/39691/javascript-best-practices. 함수 외부의 "var"가없는 것은 "window"네임 스페이스 (예 : window.test, window.clickhandler)에 정의됩니다. – fenone

답변

3

블록 범위에서 익숙한 언어처럼 동작 할 것으로 예상됩니다. 더글러스 크록 포드 (Douglas Crockford)의 저서 'The Good Parts (좋은 부품들)'을 읽고 왜 모든 것이 작동 하는지를 더 잘 이해할 것을 제안합니다. 처음부터이 모든 것을 배우면 길을 더 쉽게 찾을 수 있습니다.

자바 스크립트는 기능적으로 범위가 지정됩니다.이 예제에서는 테스트 범위가 foo 내부입니다. 이 예에서

var foo = function() { 
    var test = "Peanut Butter"; 
}; 

, 당신은 세계적 범위 변수로 기능 테스트를 수정할 수 있음을 알 수있다.

글로벌 범위 변수를 정의하는 데는 세 가지 방법이 있으며, 모두 내가 피할 것을 제안합니다 (불가능하지는 않습니다). 전역 변수가 필요하지만 완화 될 수 있습니다. 그들의 생애는 자바 스크립트가로드되는 한 오래 지속됩니다. 같은 페이지에서로드 된 여러 .js 파일에 여러 개의 전역 변수를 정의하면 두 개의 전역 변수에 액세스 할 수 있으므로 실수로 다른 파일의 변수를 덮어 쓰게됩니다.

1 : 수행 한 것처럼 함수 외부에 var 문을 배치하십시오.

2 : 속성으로 전역 개체에 추가하십시오.

window.foo = value; 

3. 선언하지 않고 변수를 사용하십시오. 이것은 암시적인 전역 변수입니다. 조심해. 선언 한 함수는 사실 "clickhandler"라는 암시 적 글로벌 자체입니다.

foo = value; 

일반적인 방법 전역 변수의 사용을 최소화 할 수는 다른 라이브러리와의 충돌을 피하기 위해, 글로벌 변수의 나머지 부분을 유지하기 위해 응용 프로그램 특정 전역 변수를 정의하는 글로벌 저감으로 알려져있다. 이것은 객체 리터럴을 선언하고 전역 변수를 만드는 두 번째 방법을 사용하여 수행됩니다. 그러나 전역 변수가 필요할 때만 이것을 사용하고 가능한 경우 기능 범위를 고수하려고하십시오.당신은 자바 스크립트의 세계에 깊은 얻을 때

var AWESOMENEWAPP = {}; 
AWESOMENEWAPP.test = "Peanut Butter"; 

, 당신은 깨끗하고 정돈 된 코드를 유지하기 위해 폐쇄 등과 같은 유용한 것들에 대해 학습을 시작합니다.

자바 스크립트가 일반적인 고전 언어처럼 작동하지 않는다는 것과 자바 스크립트가 그 자체로 강력한 언어라는 것을 알게 될 것입니다.

여행 중에 JSLint 도구를 사용하여 컴파일되지 않았기 때문에 표시되지 않는 규칙 및 오류 코드를 테스트 해 보시기 바랍니다.

+0

이것은 철저한 답장입니다. 정말 고마워요! –

+0

_ "수명은 페이지가 존재하는만큼 길다."_ XUL 앱의 기본 모양은 나를 너무 속여서 본질적으로 '페이지'임을 잊어 버렸다. 다시 말해, XPCOM 객체를 사용하는 것 외에 다른 전역 변수를 공유 할 수있는 방법이 없다는 뜻입니까? –

+0

XUL을 실제로 사용한 적이 없으므로 정직하지는 않을 것입니다 ... 그러나 다른 창간에 데이터를 공유하려면 현재 IMO를 수행하는 가장 좋은 방법은 웹 메시징 API입니다. 데이터를 공유하기 위해 다른 윈도우에 메시지를 보내고 메시지를받을 수 있다는 것을 알고있는 핸들러와 무엇을해야 할지를 묻습니다 .. 다시 XUL 앱을 사용하지 않았고 시도하려는 것을 정확히 모릅니다. 그러니 최선의 것이 무엇인지 말하기는 어렵습니다. –

1

예, 글로벌 함수 및 변수는 사용자가 응용 프로그램을 종료하거나 브라우저를 사용하는 경우 해당 탭을 닫을 때까지 존재합니다. 가능한 경우 변수 또는 함수로 전역 범위를 범람시키지 않는 것이 좋습니다.