JavaScript에서 전역 변수를 선언하는 방법은 무엇입니까?


답변:


215

프로덕션 코드에서 전역 변수를 생성해야하는 경우 (피해야 함) 항상 명시 적으로 선언하십시오 .

window.globalVar = "This is global!";

var동일한 이름의 로컬 변수가 없다고 가정 하여 전역 변수를 정의하는 것이 가능하지만 암시 적 전역을 생성 하는데, 이는 나쁜 일이며 엄격 모드 에서 오류를 생성 합니다 .


window브라우저에서만 사용할 수 있습니다. 모든 환경에서 작동하도록 답변을 편집 할 수 있습니까? JavaScript에서 전역 객체를 얻는 방법을
Michał Perłakowski

52

이것이이 변수를 사용하는 유일한 응용 프로그램이라면 Felix의 접근 방식이 우수합니다. 그러나 jQuery 플러그인을 작성하는 경우 jQuery 객체에 필요한 "namespacing"(따옴표에 대한 자세한 내용 ...) 변수 및 함수를 고려하십시오. 예를 들어, 현재 miniMenu라는 jQuery 팝업 메뉴에서 작업하고 있습니다. 따라서 miniMenujQuery에서 "네임 스페이스"를 정의하고 모든 것을 그곳에 배치했습니다.

자바 스크립트 네임 스페이스에 대해 이야기 할 때 따옴표를 사용하는 이유는 일반적인 의미에서 네임 스페이스가 아니기 때문입니다. 대신 자바 스크립트 객체를 사용하고 모든 함수와 변수를이 객체의 속성으로 배치합니다.

또한 편의상 일반적으로 플러그인 네임 스페이스의 하위 공간을 i 내부에서만 사용해야 사용자에게 숨길 수 있습니다.

이것이 작동하는 방식입니다.

// An object to define utility functions and global variables on:
$.miniMenu = new Object(); 
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();

이제 할 수 $.miniMenu.i.globalVar = 3있거나 $.miniMenu.i.parseSomeStuff = function(...) {...}전 세계적으로 무언가를 저장해야 할 때마다 여전히 전역 네임 스페이스에서 유지합니다.


그 Tomas에 감사드립니다. 위에서 언급 한 사이트에서 Felix 접근법은 제대로 작동하지만 여러 플러그인을 사용하는 다른 사이트도 있으며 작동하려면 접근 방식이 이상적입니다. 당신의 도움을 위해 건배.
댄서

이것은 완벽하게 작동합니다! @Tomas가 말한 것처럼 사용자 정의 함수 또는 변수에 대한 클래스 / 홀더를 작성하십시오. +1
Pierre

감사합니다 토마스! 더 이상 필요하지 않은 경우 상위 개체를 삭제하십시오 (예 :) delete $.miniMenu. 괜찮습니까?
Kunj

1
@ KunJ : 물론, 다른 것과 마찬가지로 : 더 이상 사용되지 않을 것이라고 확신하면 삭제하는 것이 안전합니다. 당신이하지 않도록하지만, 자바 스크립트 의지 쓰레기는 당신을 위해 그것을 수집 delete $.miniMenu.
Tomas Aschan

20

편집 질문은 JavaScript에 관한 것이고, 대답은 jQuery에 관한 것입니다. 이것은 jQuery가 널리 퍼진 시대의 오래된 답변입니다.

대신 JavaScript의 이해 범위폐쇄 를 권장합니다.

오래되고 나쁜 대답 : jQuery를 사용하면 선언 위치에 관계 없이이 작업을 수행 할 수 있습니다.

$my_global_var = 'my value';

그리고 어디서나 사용할 수 있습니다. 이미지가 다른 곳에 퍼져있을 때 빠른 이미지 갤러리를 만드는 데 사용합니다.

$gallery = $('img');
$current = 0;

$gallery.each(function(i,v){
    // preload images
    (new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
    $current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
    $current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});

:이 페이지의 콘솔 에서이 전체 코드를 실행하십시오. ;-)


3
$ gallery와 $ current는 일반적인 전역 변수가 아닌가? 'var'을 생략하여 전역 변수로 정의하기 때문에 작동하지만 앞에있는 달러 기호는 'jQuery 변수'를 만들지 않습니다 ... 문자 그대로 밑줄이나 다른 부호를 넣는 것과 같습니다. ... jQuery 객체 ($)를 사용하고 속성을 추가하면 jQuery 변수가됩니다. $ .myGlobalVariable = 'my value'...
Andres Elizondo

당신은 아마 맞을지 모르지만 주목할 가치가있는 것은 $ myVar 구문을 사용하면 2 개의 출현을 얻게됩니다. 2) 코드 내에서 전역 변수를 매우 쉽게 추적 할 수 있습니다. 토론을 시작
하세요

오답입니다. Andres에 동의하십시오. 이는 jQuery 변수가 아닙니다. $current = 0;함수의 시작 부분을 정의하지 않으면 나중에 작동하지 않습니다.
harrrrrrry

15

다음은 나머지 함수가 액세스 할 수있는 전역 변수의 기본 예입니다. 다음은 실제 예입니다. http://jsfiddle.net/fxCE9/

var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);


function myFunction1() {
    myVariable = 'Hello 1';
}

function myFunction2() {
    myVariable = 'Hello 2';
}

jquery ready () 함수 내 에서이 작업을 수행하는 경우 변수가 다른 함수와 함께 ready () 함수 안에 있는지 확인하십시오.


jQuery에서 전역 변수가 어떻게 작동하는지에 대한 최상의 답변.
클린턴 그린

1
나는 파고 들었다는 것을 알고 있지만 이것은 명백한 전역 변수가 아닙니다. 이것은 매우 작은 스크립트의 클로저로 범위가 지정되지 않은 공유 공용 변수와 더 조화를 이룹니다. 그것들은 완전히 다른 두 가지 방법 / 사용법이며 여러 스크립트의 중간에있는 스크립트에서 명시 적 전역을 선언하면 큰 문제가 발생합니다. 팀의 프론트 엔드가 스크립트의 맨 위에 전역 변수를 선언하여 DOM에 10 번째로 호출되는 것을 상상할 수 있습니다.
Brian Ellis

4

함수 외부에서 변수 선언

function dosomething(){
  var i = 0; // can only be used inside function
}

var i = '';
function dosomething(){
  i = 0; // can be used inside and outside the function
}

3

가장 좋은 방법은을 사용 closures하는 것입니다. window객체는 속성으로 인해 매우 복잡해 지기 때문 입니다.

HTML

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js ( 이 답변을 기반으로 함 )

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

다음은 plnkr 입니다. 그것이 도움이되기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.