2009-07-17 27 views
5

Có lợi ích gì khi sử dụng tiền tố 'cửa sổ' khi gọi các biến hoặc phương thức javascript trong đối tượng cửa sổ không? Ví dụ, gọi 'window.alert' có lợi thế hơn là gọi 'alert'? Tôi có thể tưởng tượng sử dụng tiền tố có thể tăng hiệu suất nhỏ khi cuộc gọi được thực hiện từ bên trong một số chức năng/đối tượng, tuy nhiên tôi hiếm khi thấy điều này trong mã của mọi người. Từ đó, đến câu hỏi này.Lợi ích của việc sử dụng tiền tố 'cửa sổ' trong javascript

+0

alert Ví dụ, bởi vì nó thường chỉ được gọi một lần và nó không quan trọng (thường) phải mất bao lâu để hiển thị. – Nosredna

Trả lời

6

Tôi nghi ngờ có bất kỳ lợi ích hiệu suất đo lường nào. Sau khi tất cả các chuỗi phạm vi sẽ được quét cho số nhận dạng window đầu tiên thì đối tượng cửa sổ sẽ được quét cho mục mong muốn. Do đó nhiều khả năng nó sẽ được xác định để thực hiện.

Sử dụng tiền tố cửa sổ rất hữu ích nếu bạn có một biến khác trong phạm vi sẽ ẩn mục bạn có thể muốn truy xuất từ ​​cửa sổ. Câu hỏi đặt ra là bạn luôn có thể biết khi nào điều này có thể xảy ra? Câu trả lời là không. Vì vậy, bạn nên luôn luôn tiền tố với cửa sổ? Bạn sẽ trông như thế nào nếu bạn làm điều đó. Xấu xí. Do đó không làm điều đó trừ khi bạn biết bạn cần.

+0

Tôi không biết chuỗi phạm vi sẽ được quét cho cửa sổ! Tôi luôn nghĩ cửa sổ là một từ khóa dành riêng, và nó sẽ không xảy ra. Cảm ơn. –

+1

Chuỗi phạm vi thực sự hoạt động theo cách khác. Các biến cục bộ ghi đè các hình cầu. – superlukas

0

Tôi tưởng tượng rằng lợi ích hiệu suất ở đây đáng ngạc nhiên là không đáng kể ở mức tốt nhất, nếu có.

0

Nó chỉ quan trọng nếu bạn đang sử dụng khung và thực hiện một loạt các cuộc gọi javascript trên các khung hình, và thậm chí chỉ sau đó các kịch bản cụ thể đảm bảo sự cần thiết tham chiếu window một cách rõ ràng.

0

Khi bạn sử dụng tiền tố, bạn đang làm cho nó rõ ràng bạn đang sử dụng định nghĩa "toàn cầu" của biến, chứ không phải định nghĩa địa phương. (Tôi không chắc chắn liệu/làm thế nào bạn có thể tiêm biến vào một phạm vi trong JS, ngoại trừ sự kỳ lạ với điều này và xử lý sự kiện nội tuyến.) YMMV, bạn có thể thích sự rõ ràng, hoặc tìm thấy nó chỉ là lộn xộn.

5

Lấy từ Google (http://www.techotopia.com/index.php/JavaScript_Window_Object):

Đối tượng cửa sổ là đối tượng cấp cao nhất của hệ thống phân cấp đối tượng. Như vậy, bất cứ khi nào một phương thức đối tượng hoặc thuộc tính được tham chiếu trong một kịch bản mà không có tên đối tượng và tiền tố dấu chấm thì JavaScript được giả định là một thành viên của đối tượng cửa sổ. Điều này có nghĩa là, ví dụ, khi gọi phương thức alert() để hiển thị hộp thoại cảnh báo, cửa sổ. tiền tố không bắt buộc. Do đó các cuộc gọi phương pháp sau đây đạt được điều tương:

window.alert()
alert()

Tuy nhiên, tôi đọc nhưng chưa có thời gian để kiểm tra sau từ: (http://www.javascriptref.com/reference/object.cfm?key=20)

Một nơi bạn sẽ cần phải cẩn thận, mặc dù, là trong xử lý sự kiện. Bởi vì các trình xử lý sự kiện bị ràng buộc với Document, một thuộc tính Document có cùng tên với thuộc tính Window (ví dụ, mở) sẽ che khuất thuộc tính Window. Vì lý do này, bạn nên luôn sử dụng "cửa sổ" đầy đủ. cú pháp khi giải quyết các thuộc tính Window trong các trình xử lý sự kiện.

+0

+1 thông tin =) –

7

Điều này rất hữu ích khi thử nghiệm các giá trị đối tượng chung.Ví dụ, nếu GlobalObject không được định nghĩa thì đây ném một lỗi:

if(GlobalObject) { // <- error on this line if not defined 
    var obj = new GlobalObject(); 
} 

nhưng điều này không ném ra một lỗi:

if(window.GlobalObject) { // Yay! No error! 
    var obj = new GlobalObject(); 
} 

Tương tự với:

if(globalValue == 'something') // <- error on this line if not defined 
if(window.globalValue == 'something') // Hurrah! 

và:

if(globalObj instanceof SomeObject) // <- error on this line if not defined 
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW! 

I w không mong đợi để thấy sự khác biệt đáng kể về hiệu năng, và lý do duy nhất khác bạn có thể làm là đảm bảo rằng bạn đang thực sự nhận được một giá trị từ phạm vi toàn cầu (trong trường hợp giá trị đã được định nghĩa lại trong phạm vi hiện tại).

1

Theo như hiệu suất, tôi nghĩ AnthonyWJones đã đề cập đến nó.

Một lần sử dụng tiền tố cửa sổ là làm rõ một thứ gì đó có sẵn bên ngoài phạm vi hiện tại. Nếu bạn đang viết mã bằng chức năng tự gọi để tránh gây ô nhiễm phạm vi toàn cầu, nhưng có điều gì đó bên trong mà bạn muốn làm cho toàn cầu có sẵn, bạn có thể làm như sau:

(function(){ 
    function foo(){ 
     //not globally available 
    } 
    function bar(){ 
     //not globally available   
    } 
    window.baz = function(){ 
     //is globally available 
     foo(); 
     bar(); 
    }; 
})(); 
+0

'baz = function() {/ * ... * /}' thực hiện tương tự, và không, AnthonyWJones không được bảo vệ. Tiêu chuẩn này đảm bảo có một lợi ích hiệu suất có thể đo lường được (không chỉ trong JS, mà còn bằng các ngôn ngữ như Lua), do các phạm vi hoạt động như thế nào. – superlukas

Các vấn đề liên quan