2012-05-09 35 views
29

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?

+2

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). –

+2

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). –

Trả lời

36

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.

0

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' 
5

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.

+2

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). –

2

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)

9

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.

+3

Đây là câu trả lời hay nhất. –

2

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.

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