Tôi xin lỗi trước nếu câu hỏi này quá rộng. Trong thực tế nó là 4 câu hỏi khác nhau, nhưng tất cả liên quan đến cùng một đoạn mã, và tôi nghĩ rằng tất cả chúng xoay quanh cùng một nguyên tắc.Javascript: Mã này có tác dụng gì?
Tôi quyết định hôm nay, sau khi sử dụng JS trong nhiều năm, để bắt đầu học cách JS hoạt động thay vì xử lý nó như C chạy trong trình duyệt. Vì vậy, tôi bắt đầu đào sâu vào mã jQuery để xem các nhà phát triển JS thực sự sử dụng ngôn ngữ lang thang như thế nào. Đó là khi tôi tìm thấy một khối mã trông giống như mã bên dưới. Lưu ý, tôi lấy mã này ra khỏi một bài đăng xếp chồng khác ở đây In Javascript, can you extend the DOM?. Vì vậy, điều đó không có nghĩa là người đã viết mã này thậm chí còn biết anh ta đang nói về cái gì.
var myDOM = (function(){ // #1
var myDOM = function(elems){ // #2
return new MyDOMConstruct(elems);
},
MyDOMConstruct = function(elems) {
this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems];
return this; // #3
};
myDOM.fn = MyDOMConstruct.prototype = {
forEach : function(fn) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
fn(elems[i], i);
}
return this;
},
addStyles : function(styles) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
for (var prop in styles) {
elems[i].style[prop] = styles[prop];
}
}
return this;
}
};
return myDOM; // #4
})();
1 Tại sao phải khai báo hàm bằng var myDOM = (function() {})(); thay vì var myDOM = function() {};
2 Tại sao phải khai báo hàm khác bên trong hàm myDOM có cùng tên chính xác? Tại sao không đặt tất cả logic của myDOM bên trong bên trong hàm myDOM bên ngoài?
3 Tại sao trả lại "điều này" một cách rõ ràng? Điều đó sẽ được thực hiện tự động, đúng không?
4 Điều gì đang xảy ra ở đây? Nó có trả về hàm tạo của myDOM bên trong không? Nếu vậy, tại sao?
Cập nhật
Vì vậy, hầu hết nó làm cho cảm giác bây giờ. Về # 1, tôi nghĩ myDOM đã được gán chức năng được xác định sau khi =, nhưng nó không phải. Nó đang được gán bất cứ chức năng nào trả về. Mà chỉ xảy ra là một chức năng.
Tôi vẫn chưa rõ về # 3. Có, tôi hiểu sử dụng chức năng như thế này
console.log(MyDomConstruct('foo'))
Sẽ hiển thị 'không xác định'. Nhưng đó không phải là cách nó được sử dụng. Một vài dòng lên là này
return new MyDomConstruct(elems);
tôi có thể hiểu explicity trở về "này" nếu tuyên bố đã đi như thế này
return MyDomConstruct(elems);
Nhưng đó không phải là trường hợp.
Thực ra 'new MyDomConstruct (elems)' không trả về 'this' mà là một thể hiện mới của' MyDomConstruct'. Có thể trong một ngữ cảnh khác, điều này dễ hiểu hơn. – nre
Phải. Nhưng "điều này" và một thể hiện mới của MyDomConstruct là cả hai trường hợp của MyDomConstruct, không? Ngoài ra tại sao thậm chí sử dụng câu lệnh "mới" nếu hàm sẽ trả về một cá thể của chính nó? – mellowsoon
Tất cả các câu trả lời hay. Tôi đưa ra câu trả lời cho jAndy bởi vì anh ta trả lời trước, nhưng +1 cho mọi người khác. – mellowsoon