Tôi tiếp tục thấy cảnh báo không sử dụng các biến toàn cục trong JavaScript, nhưng có vẻ như lý do duy nhất mà mọi người nói đó là vì làm tắc nghẽn không gian tên chung. Tôi có thể tưởng tượng điều này được dễ dàng cố định bằng cách đặt tất cả các biến vào một đối tượng lớn. Bây giờ câu hỏi đặt ra là: có lý do nào khác không sử dụng các biến toàn cục khác ngoài lợi ích không? Có bất kỳ vấn đề về hiệu suất hoặc khả năng tương thích nào liên quan đến chúng không?Tại sao các biến toàn cầu được coi là hành vi xấu?
Trả lời
Chúng làm lộn xộn vùng tên chung và chậm hơn so với các biến cục bộ.
Trước hết, có nhiều biến toàn cầu luôn là điều xấu vì dễ quên bạn đã khai báo biến ở đâu đó và vô tình khai báo lại ở một nơi khác. Nếu biến đầu tiên của bạn là địa phương thì bạn không có vấn đề gì. Nếu nó là toàn cầu, thì nó chỉ bị ghi đè. Điều này càng trở nên tồi tệ hơn khi bạn tham gia vào các hình cầu được ngụ ý (ví dụ: khi bạn nói someVar = someValue
mà không khai báo someVar với từ khóa var
).
Thứ hai, các biến toàn cầu mất nhiều thời gian hơn để Javascript "tìm" hơn các biến cục bộ. Sự khác biệt về tốc độ không phải là rất lớn, nhưng nó hiện tồn tại.
Để đọc thêm và giải thích sâu hơn về lý do tại sao hình cầu được coi là hành vi xấu, bạn có thể muốn xem this page.
Về cơ bản, vì chúng có thể được truy cập từ bất kỳ tập lệnh nào trên trang và vì bạn có thể lặp lại tên của nó trong cùng một phạm vi. Đó là lý do tại sao rất nhiều động cơ Javascript sử dụng mã này:
(function(){
var foo = 'foo',//Local
bar = 'bar';//Local
window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar);//'foobar'
Nếu kịch bản của bạn là rất dài và bạn sử dụng các biến này từ rất nhiều các chức năng nó sẽ làm tăng thời gian gỡ lỗi của bạn vì giá trị của biến toàn cầu có thể đã được thay đổi từ bất cứ nơi nào vì vậy nếu bạn đang theo dõi nơi mà điều này thay đổi thành một giá trị không mong đợi bạn sẽ phải kiểm tra tất cả.
Kịch bản này thậm chí còn đau đớn hơn nếu các lập trình viên khác nhau sửa đổi biến này từ các tập lệnh khác được đưa vào trang của bạn.
Gỡ lỗi khó hơn chỉ là một lý do tại sao hình cầu là xấu. Các trường hợp khác được liệt kê tại [Tại sao các hình cầu lại quá xấu] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –
Không nên có bất kỳ vấn đề sử dụng các biến toàn cầu trong mã của bạn miễn là bạn đang gói chúng trong một namespase uniqe/đối tượng (để tránh va chạm với các kịch bản mà không phải là của bạn)
Có một adventage của sử dụng biến toàn cầu trong javascript, và nó xuất phát từ thực tế là javascript không phải là một ngôn ngữ kiểu mạnh. ở đó, nếu bạn truyền các đối tượng phức tạp như các đối số cho một hàm, bạn sẽ mất tất cả sự intellisence cho các đối tượng đó (bên trong phạm vi hàm.) trong khi sử dụng các đối tượng toàn cầu insteads, sẽ bảo toàn tính intellisence đó. và khi bạn có intelisence, nó thực sự có thể cải thiện thời gian gỡ lỗi (như trái ngược với những gì người khác nói ...)
Cá nhân tôi thấy rằng rất hữu ích và chắc chắn có vị trí trong mã của tôi.
(tất nhiên, ta nên alwayse làm cho sự cân bằng giữa người dân địa phương và các biến globals)
biến toàn cầu có thể làm tăng đáng kể khớp nối, làm giảm đáng kể khả năng mở rộng và testability mã của bạn. Một khi bạn bắt đầu sử dụng globals, bây giờ bạn phải biết ở đâu và làm thế nào biến được sửa đổi (tức là phá vỡ đóng gói). Hầu hết các tài liệu và công ước ra có sẽ tranh luận rằng hiệu suất là ít nhất của mối quan tâm của bạn khi sử dụng globals.
Đây là số fantastic article outlining why biến toàn cầu gây ra chứng đau đầu.
Đây là câu trả lời hay nhất. –
Tóm lại, Biến toàn cầu gây ra (và nhiều hơn nữa) các vấn đề sau.
1) Va chạm đặt tên biến - Nếu bạn đang làm việc trên một nhóm và cả bạn và đồng nghiệp của bạn sử dụng cùng tên biến trên phạm vi toàn cầu, biến được xác định cuối sẽ ghi đè biến ban đầu. Điều này rõ ràng có thể có hậu quả tàn phá.
2) Bảo mật - Cụ thể trên web, mọi người dùng đều có quyền truy cập vào đối tượng Window (hoặc toàn cục). Bằng cách đặt các biến trên phạm vi toàn cầu, bạn cung cấp cho mọi người dùng khả năng xem hoặc thay đổi các biến của bạn.
3) Chậm hơn - Điều này được cho là không đáng kể nhưng vẫn tồn tại. Cách tìm kiếm biến JavaScript hoạt động là công cụ JavaScript sẽ thực hiện tìm kiếm trên phạm vi hiện tại mà biến đang được tra cứu. Nếu không thể tìm thấy nó, nó sẽ tìm kiếm trên phạm vi cha mẹ kế tiếp. Nếu nó không tìm thấy nó ở đó, nó sẽ tiếp tục nhìn lên trên cho đến khi nó đạt đến đối tượng toàn cầu tìm kiếm biến đó. Nếu tất cả các biến của bạn nằm trên phạm vi toàn cầu, thì công cụ JavaScript sẽ luôn phải trải qua mọi phạm vi để cuối cùng đạt được phạm vi toàn cầu để tìm biến.
- 1. Tên biến không được bắt đầu bằng 'm_': Quy tắc StyleCop 1308 - Tại sao tên này được coi là hành vi xấu (hoặc không tốt/tiêu chuẩn)?
- 2. Tại sao tất cả các mũ liên tục được coi là phong cách mã hóa xấu?
- 3. Nhà điều hành đô la ($) có bị coi là xấu không? Tại sao?
- 4. biến toàn cầu không có phạm vi toàn cầu
- 5. Tại sao Lua mặc định thành biến toàn cầu?
- 6. Tại sao Redis được coi là CP?
- 7. Tại sao nhiều bài tập trong một dòng được coi là kiểu xấu?
- 8. Tại sao hình cầu lại xấu?
- 9. Tại sao các điểm đánh dấu vị trí, như đầu tiên hoặc cuối cùng, trong một liệt kê coi là hành vi xấu?
- 10. Git thẻ toàn cầu --- rõ ràng là xấu, nhưng tại sao?
- 11. Tại sao sizeof được coi là toán tử?
- 12. Tại sao các tổ chức ẩn danh toàn cầu được yêu cầu phải được khai báo là tĩnh?
- 13. Việc sử dụng Haskell's Text.JSON được coi là xấu?
- 14. Tại sao những từ này được coi là từ dừng?
- 15. Tại sao "tiếp tục" được coi là vi phạm C trong MISRA C: 2004?
- 16. Tại sao enums được coi là loại hợp chất?
- 17. Tại sao mảng Java này được coi là hai chiều?
- 18. Tại sao sử dụng URL chứa dấu hai chấm được coi là "yêu cầu nguy hiểm"?
- 19. Tại sao các tham chiếu vòng tròn được coi là có hại?
- 20. Tại sao HTTP/SOAP được coi là "dày"
- 21. Tại sao javascript: void (0) được coi là có hại?
- 22. Biến toàn cầu và MPI
- 23. Tại sao việc gán cho các biến toàn cầu của tôi không hoạt động trong Python?
- 24. Hãy mô tả những hành vi của bạn bằng cách giảm thiểu việc sử dụng các biến toàn cầu
- 25. Tại sao biến toàn cục chưa được khởi tạo là biểu tượng yếu?
- 26. Biến C# ASP.NET C# là toàn cầu?
- 27. Tại sao lại coi 0 là True trong Ruby?
- 28. Phạm vi lớp typedef thực hành xấu?
- 29. Đóng PHP và phạm vi biến toàn cầu tiềm ẩn
- 30. Chuỗi mật khẩu đăng nhập Dollar ($) được coi là biến
bản sao có thể có của [Tại sao các hình cầu là xấu?] (Http://stackoverflow.com/questions/4246284/why-are-globals-bad) và [các câu hỏi khác] (http://stackoverflow.com/search? q = javascript + lý do + là + biến + chung + xấu). –
JavaScript hoặc các ngôn ngữ khác, ít quan trọng hơn. Dưới đây là [câu trả lời chuẩn về lý do tại sao hình cầu là xấu] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –