Trước tiên, bạn có chắc chắn bạn biết không gian tên là gì không? Thật nhanh:
Hãy sử dụng sự tương tự. Trên máy tính của bạn, bạn có tệp. Nhưng bạn không chỉ có các tập tin bạn có thư mục. Tại sao?
Vì nếu không có thư mục, tên tệp sẽ phải là duy nhất và sẽ rất khó để giữ mọi thứ được sắp xếp.
Tương tự cho các tên biến nếu bạn chỉ có các biến toàn cầu. Nếu bạn chỉ có thể có các biến toàn cầu, mỗi tên biến sẽ phải là hoàn toàn duy nhất.
Điều này sẽ rất khó theo dõi. Rất có thể bạn sẽ phải sử dụng tên biến tương tự một cách tình cờ. Mã của bạn sẽ hoạt động hài hước và rất khó để theo dõi vấn đề.
Vậy giải pháp là gì?
Đúng vậy đặt biến của bạn vào thư mục, ahem, xin lỗi, tôi có nghĩa là không gian tên, đặt chúng vào không gian tên. Tôi phải tìm ra cách sử dụng phím backspace.
Dù sao, các ngôn ngữ như C# và Java cho phép bạn thực hiện chính xác này:
// C# - example of a language with built in support for namespaces
namespace MySpace {
class MyClass {
}
}
namespace Facebook {
class MyClass {
}
}
Có không có xung đột vì lớp học nằm trong không gian tên khác nhau. Sau đó, trong mã của bạn nếu bạn muốn nhanh chóng chúng bạn sẽ viết một cái gì đó như thế này:
// C# again (JavaScript code coming up soon - keep scrolling)
var myObject = new Facebook.MyClass();
Đó là tuyệt vời nhưng JavaScript không có một từ khoá namespace
. Về mặt kỹ thuật nó không có không gian tên, những gì nó có là một số lập trình viên thực sự thông minh.
Giải pháp của họ? Sử dụng các đối tượng.
// JavaScript
var MySpace = {};
MySpace.MyFunction = function() {
// insert brilliant code here
};
var Facebook = {};
Facebook.MyFunction = function() {
// insert more brilliant code here
};
Bây giờ bạn có 2 chức năng với tên "giống nhau" không cản trở nhau. Nếu bạn muốn gọi phiên bản Facebook
của MyFunction
bạn sẽ viết mã như thế này:
// JavaScript
Facebook.MyFunction();
Như bạn có thể thấy trong các ví dụ MySpace
và Facebook
đang thực sự đối tượng, nhưng họ là những đối tượng mà chúng ta đang sử dụng chỉ để chức năng riêng biệt và các biến, có nghĩa là chúng tôi đang sử dụng chúng cho không có gì hơn để phục vụ như không gian tên.
Một Chú thích
Rất nhiều lần bạn sẽ thấy "namespace" đối tượng tuyên bố như thế này:
var MySpace = MySpace || {};
Điều này có nghĩa MySpace = MySpace
nếu đối tượng MySpace
đã tồn tại. Nếu không, nó được gán một đối tượng trống mới.Đây là cách tái sử dụng đối tượng/không gian tên MySpace
trong nhiều tệp.
Mỗi tệp sẽ thêm các hàm và biến riêng của nó vào cùng một đối tượng "không gian tên". Ví dụ:
var MySpace = MySpace || {};
MySpace.a = 10;
var MySpace = MySpace || {};
MySpace.b = 20;
Bạn kết thúc với một đối tượng MySpace có các biến a
và b
. Điều này đúng ngay cả khi mã nằm trong các tệp khác nhau và ngay cả khi bạn đảo ngược thứ tự.
Làm thế nào để bạn xác định "không gian tên"? – nnnnnn
Thật đơn giản: Không có không gian tên trong JavaScript. – Bergi
Không có "không gian tên" trong javascript. Các đối tượng với các thuộc tính được sử dụng để tránh rất nhiều biến trong một phạm vi cụ thể, thường là phạm vi toàn cục. Đây là (không chính xác) được gọi là "không gian tên" vì chúng hoạt động giống như không gian tên. – RobG