2012-01-11 17 views
5

Tôi đã nhìn vào nồi hơi Backbone-requireJS trong GitHub, tôi thấy hai loại triển khai khác nhau.Có lý do chính đáng nào để bao bọc thêm một hàm được gọi hàm immedeately xung quanh định nghĩa mô-đun requireJS không?

https://github.com/david0178418/BackboneJS-AMD-Boilerplate/blob/master/src/js/views/viewStub.js có những điều sau đây là viewStub:

function() { 
    "use strict"; 

    define([ 
      'jqueryLoader', 
      'underscore', 
      'backbone', 
     ], 
     function($, _, Backbone) { 

      return Backbone.View.extend({ 
       template : _.template(/*loaded template*/), 

       initialize : function() { 
        this.render(); 
       }, 

       render : function() { 
        $(this.el).append(this.template(/*model/collection*/)); 

        return this; 
       } 
      }); 
     } 
    ); 
})(); 

Trong khi xem sơ khai từ bản mẫu khác https://github.com/jcreamer898/RequireJS-Backbone-Starter/blob/master/js/views/view.js có sau đây:

define([ 
     'jquery', 
     'backbone', 
     'underscore', 
     'models/model', 
     'text!templates/main.html'], 
function($, Backbone, _, model, template){ 
    var View = Backbone.View.extend({ 
     el: '#main', 
     initialize: function(){ 
      this.model = new model({ 
       message: 'Hello World' 
      }); 
      this.template = _.template(template, { model: this.model.toJSON() }); 
     }, 
     render: function(){ 
      $(this.el).append(this.template); 
     } 
    }); 

    return new View(); 
}); 

Câu hỏi của tôi ở đây là: Tại sao có một chức năng tự thực hiện xung quanh toàn bộ mô-đun RequireJS trong ví dụ đầu tiên?

+0

@missingno cảm ơn bạn đã chỉnh sửa! – Karthik

Trả lời

1

Không cần phải có đóng cửa có chứa trong ví dụ này. Nó tạo ra một phạm vi để các biến hoặc các hàm được khai báo không bị rò rỉ vào phạm vi toàn cục. Nhưng khi bạn không tạo ra các biến hoặc các hàm được đặt tên, thì không có gì để rò rỉ. Vì vậy, không có nhiều điểm.

Lý do thực sự có thể đơn giản hơn bạn nghĩ. Giống như sử dụng tín hiệu rẽ ngay cả khi không có ai ở xung quanh, bao quanh mọi tệp nguồn JS trong một hàm tự thực hiện là một thói quen tốt để tham gia. Nó giúp bạn tiết kiệm từ những sai lầm ngu ngốc. Vì vậy, nó có thể chỉ là một ví dụ về một phong cách lập trình phòng thủ.

Không có lợi ích trong ví dụ này, nhưng chi phí hiệu suất liên quan trong thời gian chạy là hoàn toàn không đáng kể. Vì vậy, tại sao không làm điều đó theo cách "đúng" trong trường hợp một số mới đến và "duy trì" mô-đun này trong một số cách sôi nổi?

+0

Điều đó có ý nghĩa. Cảm ơn! – Karthik

+0

Điều đó có ý nghĩa. Cảm ơn! Tôi có một câu hỏi khác mà tôi quên thêm vào bài đăng gốc. Trong ví dụ thứ hai, một thể hiện của đối tượng View tức là 'new View()' được trả về từ module. Nếu mô-đun này được hai mô-đun khác giới thiệu, họ sẽ sử dụng cùng một cá thể 'Xem', (HOẶC) chúng sẽ là các cá thể khác nhau không? Nếu nó là cùng một trường hợp, tôi tự hỏi, ai quản lý điều này? requireJS? – Karthik

+0

Đó là loại lên đến require.js. Tôi tin rằng nó chỉ thực hiện các mô-đun yêu cầu một lần, và sau đó lưu trữ kết quả. Vì vậy, có, nó sẽ trả về cùng một ví dụ mỗi lần. Vì vậy, 'return View;' có thể có ý nghĩa hơn. Nếu bạn trả về hàm khởi tạo thay vào đó, thì nó tùy thuộc vào mã đang thực hiện yêu cầu để khởi tạo một khung nhìn. –

0

Hoàn toàn không có điểm khi thực hiện việc này, bởi vì bạn đã có một chức năng tạo ra các không gian tên riêng của nó.

Ngoài ra còn có một bất lợi - bạn đang nhận được thụt lề thêm, do đó mã của bạn trở nên ít đọc được hơn.

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