2011-01-20 22 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); 

Voy a llamar a este código usandopase de parámetros a la función de cierre en javascript

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

pero el 'id' y las opciones parece no estar definido.
alguien puede ayudar?

+0

Empecé con algo como esto (sin cierre) y luego pensé que iba a tratar de refactorizar la función en un cierre. MyLibrary.MyModule = inicialización de función (id, opciones) { this.id = id; .. } – Abhijit

+1

Con su refactor, está * invocando * el constructor en lugar de * asignarlo *. Si desea que tenga un alcance con algunos valores predeterminados, debe tener la función que invoca * devolver * su constructor. Me gusta: 'MyLibrary.MyModule = (function (_id, _options) {return function initialise (id, options) {/ * tu cuerpo de funciones * /};}) (id, options);', aunque no estoy seguro si esta fue tu razón para hacerlo de esa manera. – user113716

Respuesta

5

Su MyLibrary.MyModule en sí es undefined. Esto se debe a que está invocando una función anónima sin valor de retorno para asignarle.

Asumo que significan para hacer esto en su lugar:

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); 
     }; 

Ahora usted puede hacer:

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

... y el 'c' y options serán recibidos como argumentos para el constructor.

Si su propósito para la expresión de la función invocada inmediatamente era cerrar alrededor de algún valor por defecto que el constructor podría hacer referencia, a continuación, el IIFE tendría que retorno una función que hace referencia a ese valor.

4

Como está escrito, no creo que vaya a hacer algo como lo que quiere. Estás inicializando "MyLibrary.MyModule" para que sea básicamente nada; no hay valor de retorno de esa función de "inicialización", y la está llamando como si tuviera una.

no puedo decir lo que estamos tratando de hacer, pero:

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

medios, "llamar a la función lo con una lista de argumentos que consiste en los valores de la variable 'id' y variables "opciones", y luego establecer la propiedad "MyModule" en el objeto al que hace referencia "MyLibrary" con el valor que devuelve esa llamada de función. "

Cuando el humo desaparece, "MyLibrary.MyModule" no será una función, por lo que yo sé. Quizás si explicas lo que quieres que signifique, entonces alguien puede ayudar a solucionarlo.

0

quieres algo como esto:

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' 
     }, 
    } 
}; 
Cuestiones relacionadas