Hai khối mã bạn đã hiển thị khác nhau đáng kể về thời gian và lý do chúng thực thi. Chúng không loại trừ nhau. Chúng không phục vụ cùng một mục đích.
Mô-đun JavaScript
(function($) {
// Backbone code in here
})(jQuery);
Đây là một mẫu "Mô-đun JavaScript", được triển khai với một hàm gọi ngay lập tức.
Mục đích của mã này là cung cấp "tính mô-đun", quyền riêng tư và tính đóng gói cho mã của bạn.
Việc thực hiện điều này là một hàm ngay lập tức được gọi bởi (jQuery)
dấu ngoặc đơn. Mục đích của việc chuyển jQuery vào trong dấu ngoặc đơn là cung cấp phạm vi cục bộ cho biến toàn cục. Điều này giúp giảm thiểu chi phí tìm kiếm $
biến và cho phép nén / tối ưu hóa tốt hơn cho các bộ thu nhỏ trong một số trường hợp.
Các hàm gọi ngay lập tức được thực thi, tốt, ngay lập tức. Ngay sau khi định nghĩa hàm hoàn tất, hàm được thực thi.
Hàm "DOMReady" của jQuery
Đây là bí danh của hàm "DOMReady" của jQuery: http://api.jquery.com/ready/
$(function(){
// Backbone code in here
});
Hàm "DOMReady" của jQuery thực thi khi DOM sẵn sàng được điều khiển bởi mã JavaScript của bạn.
Mô-đun so với DOMReady trong mã xương sống
Việc xác định mã Backbone của bạn bên trong hàm DOMReady của jQuery là không tốt và có khả năng gây hại cho hiệu suất ứng dụng của bạn. Hàm này không được gọi cho đến khi DOM được tải và sẵn sàng được thao tác. Điều đó có nghĩa là bạn đang đợi cho đến khi trình duyệt phân tích cú pháp DOM ít nhất một lần trước khi bạn xác định các đối tượng của mình.
Ý tưởng tốt hơn là xác định các đối tượng Backbone của bạn bên ngoài một hàm DOMReady. Tôi, trong số nhiều người khác, thích làm điều này bên trong một mẫu Mô-đun JavaScript để tôi có thể cung cấp tính năng đóng gói và bảo mật cho mã của mình. Tôi có xu hướng sử dụng mẫu "Mô-đun tiết lộ" (xem liên kết đầu tiên ở trên) để cung cấp quyền truy cập vào các bit mà tôi cần bên ngoài mô-đun của mình.
Bằng cách xác định các đối tượng của bạn bên ngoài hàm DOMReady và cung cấp một số cách để tham chiếu đến chúng, bạn đang cho phép trình duyệt bắt đầu xử lý JavaScript của bạn, có khả năng tăng tốc trải nghiệm người dùng. Nó cũng làm cho mã linh hoạt hơn vì bạn có thể di chuyển mọi thứ mà không phải lo lắng về việc tạo thêm các hàm DOMREady khi bạn di chuyển mọi thứ.
Bạn vẫn có thể sử dụng hàm DOMReady, ngay cả khi bạn xác định các đối tượng Backbone ở một nơi khác. Lý do là nhiều ứng dụng Backbone cần thao tác DOM theo một số cách. Để làm điều này, bạn cần đợi cho đến khi DOM sẵn sàng, do đó bạn cần sử dụng hàm DOMReady để khởi động ứng dụng của mình sau khi nó đã được xác định.
Bạn có thể tìm thấy rất nhiều ví dụ về điều này trên web, nhưng đây là cách triển khai rất cơ bản, sử dụng cả Mô-đun và chức năng DOMReady:
// Define "MyApp" as a revealing module
MyApp = (function(Backbone, $){
var View = Backbone.View.extend({
// do stuff here
});
return {
init: function(){
var view = new View();
$("#some-div").html(view.render().el);
}
};
})(Backbone, jQuery);
// Run "MyApp" in DOMReady
$(function(){
MyApp.init();
});