2011-01-20 47 views
6
MyLibrary.MyModule = 
     (
      function initialise() { 
       this.id = id; 
       this.c = document.getElementById(id); 
       this.ctx = this.c.getContext('2d'); 

       this.properties = { 
        setup: { 
         backgroundColour: options.setup.backgroundColour || 'black' 
        }, 

        scale: { 
         show: options.scale.show || true, 
         colour: options.scale.color || 'white' 
        }, 
       } 
       console.log(properties.setup.baseFontSize); 
      } 
     )(id, options); 

Tôi gọi mã này sử dụngtruyền tham số cho chức năng đóng cửa trong javascript

new MyLibrary.MyModule('c',options); 

nhưng 'id' và các tùy chọn có vẻ là không xác định.
ai đó có thể trợ giúp?

+0

tôi bắt đầu với một cái gì đó như thế này (không đóng cửa) và sau đó tôi nghĩ rằng tôi muốn cố gắng để cấu trúc lại chức năng vào một kết thúc. MyLibrary.MyModule = khởi tạo hàm (id, tùy chọn) { this.id = id; .. } – Abhijit

+1

Với trình tinh chỉnh của bạn, bạn đang * gọi * hàm tạo thay vì * gán * nó. Nếu bạn muốn nó scoped với một số giá trị mặc định, bạn nên có chức năng bạn đang gọi * return * constructor của bạn. Giống như: 'MyLibrary.MyModule = (function (_id, _options) {return function initialise (id, tùy chọn) {/ * body function * /};}) (id, options);', mặc dù tôi không chắc chắn nếu đây là lý do của bạn để làm điều đó theo cách đó. – user113716

Trả lời

5

MyLibrary.MyModule chính nó là undefined. Điều này là do bạn đang gọi một hàm ẩn danh không có giá trị trả về để gán cho nó.

tôi giả sử bạn có nghĩa là để làm điều này thay vì:

MyLibrary.MyModule = function initialise(id, options) { 
      this.id = id; 
      this.c = document.getElementById(id); 
      this.ctx = this.c.getContext('2d'); 

      this.properties = { 
       setup: { 
        backgroundColour: options.setup.backgroundColour || 'black' 
       }, 

       scale: { 
        show: options.scale.show || true, 
        colour: options.scale.color || 'white' 
       }, 
      } 
      console.log(properties.setup.baseFontSize); 
     }; 

Bây giờ bạn có thể làm:

var inst = new MyLibrary.MyModule('c',options); 

... và 'c'options sẽ được nhận làm đối số cho các nhà xây dựng.

Nếu mục đích của bạn cho ngay lập tức gọi biểu hiện chức năng là để đóng xung quanh một số giá trị mặc định mà các nhà xây dựng có thể tham khảo, sau đó các IIFE sẽ cần phải trở một hàm tham chiếu đến giá trị đó.

4

Như đã viết, tôi không nghĩ rằng điều đó sẽ làm bất cứ điều gì giống như những gì bạn muốn. Bạn đang khởi tạo "MyLibrary.MyModule" về cơ bản không có gì; không có giá trị trả về từ hàm "khởi tạo" đó và bạn đang gọi nó như thể nó đã có.

Tôi không thể nói những gì bạn đang cố gắng để làm, nhưng:

MyLibrary.MyModule = (function whatever() { /* ... */ })(id, options); 

có nghĩa là "gọi hàm bất cứ điều gì với một danh sách đối số gồm các giá trị của biến 'id' và biến "tùy chọn", và sau đó đặt thuộc tính "MyModule" trên đối tượng được tham chiếu bởi "MyLibrary" cho bất kỳ giá trị nào được trả về từ cuộc gọi hàm đó. "

Khi khói xóa, "MyLibrary.MyModule" sẽ không có chức năng, theo như tôi có thể biết. Có lẽ nếu bạn giải thích những gì bạn muốn nó có nghĩa là, sau đó ai đó có thể giúp sửa chữa nó.

0

Bạn muốn một cái gì đó như thế này:

MyLibrary.MyModule = function(id, options) { 
    this.id = id; 
    this.c = document.getElementById(id); 
    this.ctx = this.c.getContext('2d'); 

    this.properties = { 
     setup: { 
      backgroundColour: options.setup.backgroundColour || 'black' 
     }, 

     scale: { 
      show: options.scale.show || true, 
      colour: options.scale.color || 'white' 
     }, 
    } 
}; 
Các vấn đề liên quan