Program Tip

자바 스크립트에서 전역 var와 window.variable의 차이점은 무엇입니까?

programtip 2020. 10. 27. 23:09
반응형

자바 스크립트에서 전역 var와 window.variable의 차이점은 무엇입니까?


backbone.js 문서를 읽고 창 개체에 속성을 할당하는 많은 코드를보고 있습니다.

window.something = "whatever";

이 코드를 호출하는 것과 변수를 할당하고 다음과 같이 전역 변수를 만드는 것의 차이점은 무엇입니까?

something = "whatever";

나는 어떤 종류의 범위가 다르고 / 또는 객체 소유권 차이가 있다고 가정하지만 (창이 소유자인지 아닌지) 둘 사이의 세부 사항과 창을 사용하는 이유와 사용하지 않는 이유에 관심이 있습니다.


차이 없음. 둘 다 동일한 효과를 갖습니다 (브라우저 window에서 전역 컨텍스트 1 ).

  • window.foo = "bar"속성을 foo설정합니다 window.
  • foo = "bar"오타 또는 의도적으로 전역을 나타냅니다 .

오타인지 아닌지 다시 한번 확인해야하기 때문에 개인적으로 직접 설정 하는 것이 더 읽기window.foo 쉽습니다.

또한, ES5 엄격 모드에 foo = "bar"있기 때문에이 불법 과제입니다 foo선언되지 않고 발생합니다 Error.

편집하다:

주석에서 언급했듯이은 foo = "bar"변수에 대한 범위 체인을 끝까지 살펴보고 발견 된 경우 foo다시 할당합니다 "bar". 찾을 수없는 경우 새 전역 변수를 만듭니다.

또한 window.foo = "bar"객체에 속성을 할당하고 있으며 delete window.foo.

ES5 엄격 모드에서는은 무효delete변수입니다.


1 node.js 및 Web Workers와 같은 다른 환경에서는 전역 개체에 대한 다른 이름이있을 수 있으며 window전혀 존재하지 않을 수 있습니다. Node.js는 .js를 사용 global하고 웹 작업자는 self.


둘 다 같은 일을합니다.
그러나 window속성 에 액세스하면 범위에 관계없이 전역 변수에 액세스하고 있음을 알 수 있습니다.
예를 들면 다음과 같습니다.

globalVar = "smth";
function(){
    var globalVar = 2;
    alert(globalVar);// points to the current scope globalVar
    alert(window.globalVar);// points to the original globalVar
}

즉, 전역으로 작업하려면 컨테이너를 통해 액세스하는 것이 다소 안전합니다. window.variable


Raynos가 언급했듯이 핵심은 창 개체에 명시 적으로 설정되어 있다는 것입니다. 브라우저에서 전역 개체는 창 개체와 동일하지만 다른 환경 (예 : node.js 또는 모바일 장치에서 일종의 웹보기에서 실행)에서는 그렇지 않을 수 있습니다.


차이점은 window.foo = bar;나중에 수행되는 리팩토링으로 가로 챌 수 없다는 것입니다. 사용 foo = bar;은 나중에 코드가 var foo정의 된 클로저로 이동 되면 더 이상 전역 객체에 설정되지 않음을 의미합니다.


한 가지 더 추가 :

당신이 참조하면 선언되지 않은 변수를 (사용하지 않고 - 직접 또는 대해서 typeof를 ) 당신은 변수가 정의되지 않은 얻을 것이다 오류 .

예 :

// var unDecVariable

if (unDecVariable != null) // Error: unDecVariable is not defined
{
    // do something
}

if (window.unDecVariable != null) // No Error
{
    // do something
}

if (typeof unDecVariable != 'undefined' && unDecVariable != null) // Alternative way
{
    // do something
}

확인되지 않은 참조 (선언되지 않은 변수라고도 함)는 실제로 변수가 아니며 전역 개체에 속성으로 추가됩니다. [5c]

In strict mode ("use strict"), unresolved references throw a ReferenceError. This is to avoid adding properties to the global object that were meant to be declared variables. In this case if you do want to add a property to the global object you would use window.foo = "bar". [5a]

참고URL : https://stackoverflow.com/questions/6349232/whats-the-difference-between-a-global-var-and-a-window-variable-in-javascript

반응형