2012-04-05 34 views
8

Gặp phải sau các dòng mã, nhưng không thể hiểu được.Bối rối về mẫu javascript này

Đây là gì (/ ... /) (điều này); mục đích trong javascript? Nó có tên cho mẫu này không?

Mã như sau:

//Move.js 
(function(exports){ 
    exports.Move = function(){ 

    }; 
})(this); 
+0

này trong doesnt javascript có nghĩa là lớp hoặc đối tượng nhưng ngữ cảnh. Bất kỳ hàm javascript nào cũng có thể được gọi, và bạn có thể thay đổi giá trị của việc này. trong đó exemple, nó chỉ là tạo ra một chức năng, gọi nó ngay lập tức và gán giá trị này để đối số xuất khẩu. vì vậy trong một nutsheel nó là định nghĩa chức năng sau đó gọi điện thoại với điều này như là một tham số. – mpm

+0

@ camus — đó là một lời giải thích rất khó hiểu. Giá trị * this * của hàm này không thực sự động, nó được thiết lập bởi cách hàm được gọi và không thể thay đổi sau đó. – RobG

+0

nếu bạn đọc cho tôi tốt, tôi đã nói về ngữ cảnh của hàm đó là động.điều này thực sự là động vì nó không được đặt thành một giá trị, nhưng phụ thuộc vào cách hàm được gọi. Lời giải thích khá rõ ràng. điều này không đề cập đến một bối cảnh, do đó nó là năng động. – mpm

Trả lời

5

mẫu này là "Immediately Invoked Function Expresssion". trong ngắn hạn, nó chỉ là một chức năng được thực hiện ngay lập tức. các this ở cuối dòng là một tham số được gửi đến các chức năng bên trong đó sẽ được truy cập như exports

(function(exports){ 

    //that was "this" outside, is now "exports" in here 

}(this)); 

trong ví dụ của bạn, chúng ta có thể giả định rằng bất cứ this là, đó là một số đối tượng đó đã được thêm vào một phương pháp Move cho nó.

một số cũng gọi mẫu này là "Module Pattern" theo nghĩa là nó tạo "môi trường có chứa" để nội dung bên trong không hiển thị do phạm vi chức năng mới. nói cách khác, bất kỳ cái gì bên trong đều thấy bên ngoài, nhưng bên ngoài chỉ có thể thấy cái bên trong cho phép nó nhìn thấy

+0

Đó không phải là ví dụ về mẫu mô-đun, nó chỉ là một biểu thức hàm được gọi ngay lập tức (IIFE), được sử dụng với mẫu mô-đun để trả về một đối tượng có thuộc tính, phương thức và quyền truy cập vào các thành viên "riêng tư" thông qua các bao đóng. – RobG

+0

* Tôi không nói * rằng mã của tôi ở trên đó là một ví dụ về mẫu mô-đun. code của tôi ở đó chỉ hiển thị 'this' trở thành' exports' bên trong hàm. Tôi không bao gồm một ví dụ về mô hình mô-đun vì mọi người đều có phong cách riêng của mình để xây dựng nó. – Joseph

+0

hmm..khi tôi nghĩ về nó. Có gì khác với mã trên với var exports = function() {// bla}. – TonyTakeshi

3

mẫu Đó chỉ đơn giản là làm cho exports giao cho this tại thời điểm thực hiện.

Giả sử phạm vi toàn cầu và trình duyệt, this sẽ trỏ đến đối tượng window.

Với những giả định đó, window.Move phải chứa hàm được gán bên trong của IIFE đó (Biểu thức hàm được gọi ngay lập tức).

Nếu chức năng này được gọi là trong một bối cảnh khác nhau, nơi thiskhôngwindow, nó sẽ gán rằng phương pháp để bất cứ điều gì this là trong môi trường bên ngoài.

+0

Có lẽ tốt hơn để nói rằng trong mã toàn cầu, * this * luôn luôn tham khảo đối tượng chung. Trong một số môi trường (ví dụ: các trình duyệt) cũng có một đối tượng * window * mà về cơ bản là cùng một đối tượng (nhưng có thể không), vì vậy * this * trong một tham chiếu ngữ cảnh chung * window *. – RobG

1

Mẫu này được gọi là "Mô-đun mô-đun". Có nhiều mẫu phụ khác nhau và mẫu này sử dụng mẫu Mô-đun được tăng cường.

Trước tiên, chúng tôi nhập mô-đun, sau đó chúng tôi thêm thuộc tính, sau đó chúng tôi xuất . Dưới đây là một ví dụ, làm tăng MODULE của chúng tôi từ trên cao:

Để biết thêm đọc về mô hình Mô-đun này kiểm tra http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

Để đọc thêm về mẫu javascript chung kiểm tra http://addyosmani.com/resources/essentialjsdesignpatterns/book/

+0

http://addyosmani.com/resources/essentialjsdesignpatterns/book/ là một VERY tốt, chi tiết, và với nhiều ví dụ, hoàn toàn phải đọc! – sMyles

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