2010-08-16 49 views
6

Thường thì tôi thấy đối tượng chung được xác định trong mã javascript để hoạt động như một không gian tên.Đối tượng toàn cầu Javascript

var MyNS = {a: function() {}, ... }; 

Nhưng đôi khi, tôi thấy mọi người rời khỏi "var" từ khóa như

MyNS = {a: function() {}, ...}; 

Tôi tin rằng trong các trình duyệt web nếu bạn không xác định một biến với var, nó được đưa vào đối tượng cửa sổ , hoạt động như một không gian tên chung. Vì nó tiết kiệm một vài byte văn bản bằng cách không sử dụng "var" là có lý do để sử dụng từ khóa cho mục đích cụ thể này?

Trả lời

8

Vì lưu một vài byte văn bản bằng cách không sử dụng "var" có lý do để sử dụng từ khóa cho mục đích cụ thể này không?

Tôi sẽ không khuyên bạn nên tránh từ khóa var, ngay cả khi bạn đang sử dụng Mã toàn cầu.

Hai cách dường như tương tự nhưng thực sự họ không giống nhau, đầu tiên là một Variable Tuyên bố, các biến Object trên mã toàn cầu, là đối tượng toàn cầu riêng của mình, đó là lý do tại sao các biến toàn cục có thể truy cập như tính chất của đối tượng chung (window.MyNS).

Trường hợp thứ hai là bài tập chưa khai báo, nó tạo thuộc tính trên đối tượng chung nếu không tìm thấy số nhận dạng trong chuỗi phạm vi.

Lý do thực sự để tránh điều này là ở tiêu chuẩn mới của ngôn ngữ, Ấn bản ECMAScript thứ 5, dưới Strict Mode, chuyển nhượng cho số nhận dạng không khai báo sẽ ném một mã số ReferenceError vi phạm mã của bạn.

Ngoài ra còn có một sự khác biệt tinh tế giữa hai ví dụ của bạn, õ biến tạo ra các tài sản trên các đối tượng toàn cầu đó là phi deleteable:

var myVar = ''; 
delete window.myVar; // false 
typeof window.myVar; // 'string' 

Trong khi việc chuyển nhượng chưa được khai báo không:

myProp = ''; 
delete window.myProp; // true 
typeof window.myProp; // 'undefined' 

Bài viết được đề xuất:

+1

+1 - Không chỉ vậy, nó chỉ đơn giản là cẩu thả. Nếu bạn muốn lưu một vài byte chỉ cần rút ngắn mã. – ChaosPandion

+0

Vì vậy, chúng ta cũng có thể khai báo biến toàn cầu bằng 'window.MyNS = {};' và có cùng hàm ý giống như 'var MyNS = {};'? – c4il

+2

@Piccolo, tốt, không chính xác * cùng *, 'window.MyNS = {};' sẽ tạo một thuộc tính * * trên đối tượng chung, trong khi 'var MyNS = {};' sẽ khai báo một biến, và như đối tượng toàn cầu, là đối tượng biến của bối cảnh thực thi toàn cục, một thuộc tính toàn cục cũng sẽ được tạo ra như là kết quả, tôi sẽ khuyên bạn nên xem xét bài viết tôi liên kết trong câu trả lời. – CMS

2

Việc sử dụng var xác định biến cục bộ trong phạm vi hiện tại. Nếu bạn đang ở trong phạm vi toàn cầu, chúng có hiệu quả tương đương. Việc sử dụng var có nhiều khả năng dễ hiểu và dễ bảo trì hơn, vì ý định này hoàn toàn rõ ràng. Nó ít rõ ràng hơn mà không cần khởi tạo var.

Trong bất kỳ phạm vi địa phương nào, nếu MyNS được khởi tạo ở đâu đó trong chuỗi phạm vi, bạn sẽ ghi đè biến cục bộ thay vì xác định biến toàn cầu.

0

Tôi nghĩ nên sử dụng từ khóa vì nó giúp bạn có thói quen và giúp ngăn ngừa các lỗi khó chịu khi bạn quên nó bên trong các cơ quan chức năng. Nó cũng tốt đẹp trong trường hợp một số mã toàn cầu tìm thấy chính nó di chuyển vào một chức năng.

Nhưng không, không cần thiết.

chỉnh sửa — @eyelidlessness có một điểm thực sự tốt, mặc dù nếu bạn nhập mã ở cấp độ toàn cầu thì đó không phải là vấn đề.

Một mô hình khá đạn Tôi đã nhìn thấy là để khởi tạo không gian tên toàn cầu với một cái gì đó như thế này:

(function(window, undefined) { 

    var foo = { stuff: "in my namespace", ... }; 

    window.foo = foo; 
})(this); 

Ở cấp độ toàn cầu, this sẽ là đối tượng cửa sổ (nếu bạn đang ở trong một trình duyệt, nếu không, thế thì bất kể đối tượng toàn cục nào nằm trong ngữ cảnh đó).

-1

Douglas Crockford về câu hỏi này chính xác: http://www.yuiblog.com/blog/2008/04/16/global-domination-part-two/

Ông lắng về việc sử dụng một bình luận với việc khởi tạo, nhưng không var. Phân tích của ông về sự cân bằng đáng đọc ngay cả khi bạn không đồng ý.

+2

Tôi là fan của Mr. Crockford nhưng IHMO đây là một trong những bài viết ** tồi tệ nhất của anh ấy **. Ba cách ông mô tả là * không hoàn toàn tương đương *, và có * mối nguy hiểm * có thể sử dụng phép gán * không khai báo (theo cách thứ ba) trong chế độ nghiêm ngặt của ES5, hơn nữa, công cụ JSLint của ông khuyến khích sử dụng lệnh "nghiêm ngặt" mà không cần kiểm tra hầu như không có quy tắc nào nghiêm ngặt hơn nữa: ( – CMS

+0

Tôi nghĩ rằng nó có liên quan để thêm rằng (rõ ràng) bài viết là từ năm 2008, do đó, không có gì ngạc nhiên khi một vài điều đã thay đổi kể từ đó. : Các bộ phận tốt "(Crockford là tác giả, cũng từ năm 2008) và có một số phần của cuốn sách tôi đã gặp cho đến nay đã trật bánh tôi trong một vài giờ trong khi tôi đã đến dưới cùng của sự nhầm lẫn. được đề nghị MỌI NGƯỜI để mài giũa kỹ năng Javascript của bạn, nhưng nó có thể đã sử dụng một Phiên bản thứ 2 như 2 năm trước! – delta9

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