window.location 대 ​​위치


79

웹에서 나는 window.location단지 location. 이유를 설명해 줄 수있는 사람이 있는지 궁금했습니다. window글로벌 객체이므로 포함 할 필요가 없습니다. 그렇지 않습니까? 당신은 사람들이 쓰기 표시되지 않습니다, 의미 window.Math.floor또는 new window.Date()내가이 지정 될 이유에 궁금 있도록 location.

나는 그것이 location당신이있는 윈도우의 "속성"으로 간주 된다는 것을 이해합니다 . 하지만 그래도 전역 개체를 지정할 이유가 없습니다. location페이지를 리디렉션하지 않고는 처음 부터 덮어 쓸 수 없습니다.

그래서 이것은 우리가 자바 스크립트를 작성하는 방법과 통합 될 정도로 오랫동안 사용되어 온 기이 한 것일까 요, 아니면 이런 식으로 일을해야하는 확실한 이유가 있습니까? Google을 확인했지만 아쉽게도 아무것도 생각하지 못했습니다 ...

답변:


85

나는 항상 window.location두 가지 주요 이유로 내 코드에서 사용합니다 .

  1. 가능한 한 전역 변수를 피하는 것이 좋습니다. window.접두사를 사용하면 변수는 전역이고 다른 변수는 그렇지 않다는 것을 상기시킵니다.
  2. Javascript 범위 지정의 특성으로 인해 범위 트리 상위에 설정된 변수를 재정의 할 수 있습니다. 이것은 var location포함하는 범위 (변수 이름으로 사용할 가능성이 낮은 단어가 아님)의 어딘가에 설정 했을 수 있으며 대신 작업 할 수 있음을 의미합니다.

저에게있어서 코딩의 목적을 명확히하는 것은 버그 작성을 피하고 버그를 작성할 때 찾아내는 데 도움이되므로 매우 중요합니다.


또한 전역 범위까지 범위 체인을 통해 루프를 만드는 대신 JS에 변수를 찾을 위치를 알려주는 것이 더 빠른 접근 방법이 될 수 있다고 생각합니다.
Rayjax 2015 년

3
@Rayjax 아니요, 실제로 JS는 무엇을 결정하기 위해 범위 체인을 반복해야하기 때문 window 입니다.
lonesomeday

16

누군가 location가 범위 체인의 어딘가에 변수를 정의하는 경우 부분적으로 안전을 위해 . 의 window.location속성에 대한 명시 적 참조가됩니다 window.

예 : http://jsfiddle.net/dr6KH/

(function() {
    var location = 'new value'; // creating a local variable called "location"

    (function() {
        alert(location);  // alerts "new value"

        alert(window.location);  // alerts the toString value of window.location
    })();

})();

11

사이에 큰 차이가있다 window.location네이티브와 Math하고 Date있다는 점이다 오브젝트 MathDate동시에 전역 객체의 속성으로 존재하는 지정된 기본 자바 스크립트 객체가가 window.location의 한 속성입니다 window 호스트 객체 (호스트 객체의 일부 측면을 나타내는 객체입니다 환경에서 제공하며 기본 JavaScript 객체와 동일한 규칙이 적용되지 않습니다. 기타 호스트 객체에는 document및 모든 DOM 요소가 포함됩니다 .

window브라우저에서는 두 가지 목적을 제공합니다. 첫째는 (잘 지정된) ECMAScript 전역 객체 역할을하고 둘째는 브라우저 환경에 대한 정보를 제공하는 호스트 객체 역할을합니다. window호스트 개체 용량에서 를 사용 하려면 명시 적으로 window.접두사를 제공하는 것을 선호 합니다. location그것 없이도 작동 한다는 사실은 window정신 분열증의 성격 에서 비롯된 우연 일뿐 입니다. 또한 다른 답변에서 지적했듯이 location현재 컨텍스트에 다른 변수가 존재할 때 보호하는 이점도 있습니다.

접두사하지 않는 한 좋은 이유 Date또는 Math와 함께 window.이렇게하면 브라우저가 아닌 환경에서 작업을하지 않는 코드를 생성하는 것입니다. 다른 환경은 일반적으로 window전역 개체의 별칭으로 제공되지 않습니다 .


6

코딩의 일부는 명확성입니다. Math 또는 Date와 달리 위치는 개념적으로 창의 속성이므로 코드에 포함하기가 더 명확 해집니다. 창." 축소를 위해 접두사를 제거하는 것이 이상적입니다.

많은 이유가 역사적이라는 것이 맞을 것입니다. Javascript는 복사 및 붙여 넣기의 광범위한 역사를 가지고 있습니다.


그게 제가 생각한 것입니다.하지만 그렇게하는 사람이 너무 많습니다. 내가 보는 거의 모든 소스는 window.location. 내가 찾을 수있는 유일한 "대"페이지는 window.location대 토론 location.href에도 도움이되지 않았습니다.
Reid

5

항상 스타일 문제가 아닙니다. 스크립트 요소를 조각에 추가 한 다음 해당 조각을 문서에 추가하여 창의로드 이벤트 후에 소셜 미디어 버튼을 비동기 적으로로드하려고했습니다. Twitter의 widgets.js는 location.href여러 곳에서 사용 되며 IE 8/9에서 다음과 같은 오류가 발생했습니다 . 메서드 또는 속성 액세스에 대한 예기치 않은 호출 . 이유를 알지 못했지만 다른 페이지의 링크를 통해 페이지를 방문 할 때만 발생합니다. 스크립트 요소를 head에 추가하거나를 사용 window.location.href하면 발생하지 않으므로 IE 8/9 및 createDocumentFragment().

예:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
    var head = document.getElementsByTagName('head')[0];
    var frag = d.createDocumentFragment();
    var s = d.createElement(t);
    s.async = true;
    s.src = 'http://platform.twitter.com/widgets.js';
    frag.appendChild(s);
    head.appendChild(frag);
} (document, 'script'));
</script>

3

window목적은 그래서 기본 작업 네임 스페이스 location와 동일합니다 window.location.

나는 사용 location이 약간 모호 하다고 생각 window.location하며 명확성을 위해 사용 합니다.


1
이 어리석은 예를 상상해보십시오 : function f() { var location = "home"; /* later on */ location = "http://google.com" } cry

@ user166390 그 논리에 window.document따라 매번 작성해야합니다 . 아무도 그런 짓을하는 것 같지 않습니다.
superlukas 2015 년

2

그것은 단지 스타일의 문제입니다.

개념적 location의 속성은 window달리 (윈도우 위치에있다) Math또는 Date.


1

location은 window 객체의 속성이므로 window.location을 요청하여 가져올 수 있습니다. 그러나 객체를 지정하지 않으면 JavaScript는 윈도우 객체를 원한다고 가정합니다. 따라서 위치를 요청하는 것은 window.location을 요청하는 것과 같습니다.


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