2011-01-17 38 views
56

Trên web, tôi thấy một số lượng lớn các lập trình viên JavaScript đang viết window.location thay vì chỉ location. Tôi đã tò mò nếu có ai có thể đưa ra một lời giải thích là tại sao. window là đối tượng toàn cầu, và do đó không cần thiết phải bao gồm - phải không? Ý tôi là, bạn không thấy mọi người viết window.Math.floor hoặc new window.Date(), vì vậy tôi tò mò muốn biết tại sao nó sẽ được chỉ định với location.window.location so với chỉ vị trí

Tôi hiểu rằng location được coi là "thuộc tính" của cửa sổ bạn đang ở, điều tôi cho là có ý nghĩa. Nhưng ngay cả như vậy, tôi không thấy bất kỳ lý do nào để xác định đối tượng toàn cầu; bạn không thể ghi đè lên location ngay từ đầu, không phải khi không chuyển hướng trang.

Vì vậy, đây có phải chỉ là một điều kỳ quặc đã được sử dụng từ lâu đến mức nó được tích hợp với cách chúng ta viết JavaScript, hoặc có một số lý do hữu hình để làm những việc theo cách này? Tôi đã kiểm tra Google, nhưng than ôi, tôi đã đưa ra không có gì ...

Trả lời

57

tôi luôn luôn sử dụng window.location trong mã của tôi vì hai lý do chính:

  1. Đó là một thói quen tốt để tránh các biến toàn cục bất cứ khi nào có thể. Sử dụng tiền tố window. nhắc tôi rằng biến là toàn cục và biến khác là không.
  2. Bản chất của phạm vi của Javascript cho phép bạn ghi đè các biến được đặt cao hơn lên cây phạm vi. Điều này có nghĩa rằng bạn có thể đã đặt một trong những phạm vi có chứa var location (nó không phải là một từ không thể sử dụng như là một tên biến) và bạn sẽ làm việc trên đó thay thế.

Đối với tôi, mục đích rõ ràng khi mã hóa là rất quan trọng vì nó giúp tôi tránh viết lỗi và sau đó giúp tôi tìm chúng khi tôi làm.

+0

Tôi cũng tưởng tượng rằng nói cho JS nơi để tìm biến thay vì làm cho nó vòng qua chuỗi phạm vi lên đến phạm vi toàn cầu có thể là một cách tiếp cận nhanh hơn. – Rayjax

+1

@Rayjax Không, thực ra, bởi vì JS cũng phải lặp qua chuỗi phạm vi để xác định 'cửa sổ 'là gì. – lonesomeday

1

Nó chỉ là vấn đề về phong cách.

Khái niệm, location là tài sản của window (cửa sổ ở vị trí), không giống như Math hoặc Date.

0

Chúng thực sự giống hệt nhau. Về mặt kỹ thuật, đối tượng "window" IS giống với phạm vi gốc cho các biến Javascript.

6

Phần mã hóa rõ ràng. Không giống như Toán hoặc Ngày, vị trí là khái niệm một thuộc tính của cửa sổ, do đó, mã trở nên rõ ràng hơn để bao gồm nó. Cửa sổ." tiền tố lý tưởng nên được loại bỏ để rút gọn.

Bạn có thể đúng rằng rất nhiều lý do là lịch sử. Javascript có một lịch sử rộng lớn về sao chép và dán.

+0

Đó là những gì tôi hình dung, nhưng có rất nhiều người làm điều đó; khá nhiều mọi nguồn tôi thấy đều sử dụng 'window.location'. Các trang "so sánh" duy nhất mà tôi có thể tìm thấy thảo luận về 'window.location' so với' location.href', điều này cũng không giúp được gì. – Reid

1

vị trí là thuộc tính của đối tượng cửa sổ, vì vậy bạn có thể lấy nó bằng cách yêu cầu window.location. Nhưng nếu bạn không chỉ định một đối tượng, JavaScript giả sử bạn muốn đối tượng cửa sổ. Vì vậy, chỉ yêu cầu vị trí giống như yêu cầu window.location.

3

Đối tượng window là không gian tên làm việc mặc định, vì vậy location sẽ bằng window.location.

Tôi nghĩ rằng việc sử dụng location hơi mơ hồ, hãy sử dụng window.location để làm rõ.

+1

Tôi đã bỏ phiếu cho câu trả lời này (và hầu như không có câu trả lời nào khác) bởi vì, hãy tưởng tượng ví dụ ngớ ngẩn này: 'function f() {var location =" home ";/* sau này trên */location = "http://google.com"} '* cry * –

+0

@ user166390 Theo logic đó, bạn nên viết' window.document' mỗi lần. Tôi nghi ngờ bất cứ ai làm điều đó. – superlukas

13

Một phần để đảm bảo an toàn trong trường hợp ai đó xác định biến số location ở đâu đó trong chuỗi phạm vi. các window.location làm cho nó một tham chiếu rõ ràng đến tài sản của window.

Ví dụ: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 
    })(); 

})(); 
6

Có sự khác biệt lớn giữa window.location và mẹ đẻ MathDate đối tượng, mà là MathDate là đối tượng JavaScript bản địa được chỉ định để tồn tại như các thuộc tính của đối tượng toàn cầu, trong khi window.location là một tài sản của chủ windowđối tượng (đối tượng lưu trữ là đối tượng đại diện cho một số khía cạnh của môi trường, được cung cấp bởi môi trường và không tuân theo các quy tắc tương tự như đối tượng JavaScript gốc. Các đối tượng lưu trữ khác bao gồm document và bất kỳ phần tử DOM nào).

window trong trình duyệt phục vụ hai mục đích: đầu tiên, hoạt động như đối tượng toàn cầu ECMAScript (được chỉ định rõ) và thứ hai, hoạt động như một đối tượng lưu trữ cung cấp thông tin về môi trường trình duyệt. Để sử dụng window trong khả năng đối tượng lưu trữ của nó, tôi muốn rõ ràng hơn và cung cấp tiền tố window.: thực tế là location hoạt động mà không có nó chỉ là trùng hợp ngẫu nhiên xuất phát từ tính chất tâm thần phân liệt của window. Ngoài ra, như được chỉ ra bởi các câu trả lời khác, điều này cũng có lợi thế là bảo vệ bạn trong trường hợp khi một biến số location khác tồn tại trong ngữ cảnh hiện tại.

Một lý do chính đáng để không thêm tiền tố Date hoặc Math với window. là làm như vậy tạo mã không hoạt động trong môi trường không phải trình duyệt. Các môi trường khác thường không cung cấp window làm bí danh cho đối tượng chung.

4

Không phải lúc nào cũng là vấn đề về phong cách - tôi đã cố gắng tải các nút mạng xã hội không đồng bộ sau sự kiện tải của cửa sổ bằng cách chắp thêm phần tử tập lệnh vào một đoạn, sau đó thêm đoạn đó vào tài liệu. Widget.js của Twitter sử dụng location.href ở một vài nơi và đã gây ra lỗi sau trong IE 8/9: Cuộc gọi bất ngờ đến phương thức hoặc quyền truy cập thuộc tính. Tôi đã không tìm ra lý do tại sao, nhưng điều này chỉ xảy ra khi truy cập trang thông qua một liên kết từ một trang khác. Nếu bạn chỉ chắp thêm phần tử tập lệnh vào đầu hoặc sử dụng window.location.href, điều này không xảy ra, do đó, nó có vẻ hơi lạ với IE 8/9 và createDocumentFragment().

Ví dụ:

<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> 
Các vấn đề liên quan