자바 스크립트에서 전역 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]
'Program Tip' 카테고리의 다른 글
Gradle 작업 정의에서 그루비 구문 이해 (0) | 2020.10.27 |
---|---|
XAML (.NET 4 Framework 이전)에서 제네릭 형식을 지정할 수 있습니까? (0) | 2020.10.27 |
MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask (0) | 2020.10.27 |
새 창이 아닌 새 탭에서 링크를 열려면 어떻게해야합니까? (0) | 2020.10.27 |
Haskell의 Data.Typeable은 무엇입니까? (0) | 2020.10.27 |