2012-03-22 16 views
8

Parece que "$ smth no es una función" es un problema muy común con JavaScript, sin embargo, después de revisar varios hilos todavía no puedo entender qué está causando en mi caso .Error de JavaScript: "no es una función"

que tienen un objeto personalizado, que se define como:

function Scorm_API_12() { 
var Initialized = false; 

function LMSInitialize(param) { 
    errorCode = "0"; 
    if (param == "") { 
     if (!Initialized) { 
      Initialized = true; 
      errorCode = "0"; 
      return "true"; 
     } else { 
      errorCode = "101"; 
     } 
    } else { 
     errorCode = "201"; 
    } 
    return "false"; 
} 

// some more functions, omitted. 
} 

var API = new Scorm_API_12(); 

Luego, en un guión diferente estoy tratando de utilizar esta API de la siguiente manera:

var API = null; 

function ScormProcessInitialize(){ 
    var result; 

    API = getAPI(); 

    if (API == null){ 
     alert("ERROR - Could not establish a connection with the API."); 
     return; 
    } 

    // and here the dreaded error pops up 
    result = API.LMSInitialize(""); 

    // more code, omitted 
    initialized = true; 
} 

El getAPI (cosas), tiene el siguiente aspecto:

var findAPITries = 0; 

function findAPI(win) 
{ 
    // Check to see if the window (win) contains the API 
    // if the window (win) does not contain the API and 
    // the window (win) has a parent window and the parent window 
    // is not the same as the window (win) 
    while ((win.API == null) && 
      (win.parent != null) && 
      (win.parent != win)) 
    { 
     // increment the number of findAPITries 
     findAPITries++; 

     // Note: 7 is an arbitrary number, but should be more than sufficient 
     if (findAPITries > 7) 
     { 
     alert("Error finding API -- too deeply nested."); 
     return null; 
     } 

     // set the variable that represents the window being 
     // being searched to be the parent of the current window 
     // then search for the API again 
     win = win.parent; 
    } 
    return win.API; 
} 

function getAPI() 
{ 
    // start by looking for the API in the current window 
    var theAPI = findAPI(window); 

    // if the API is null (could not be found in the current window) 
    // and the current window has an opener window 
    if ((theAPI == null) && 
     (window.opener != null) && 
     (typeof(window.opener) != "undefined")) 
    { 
     // try to find the API in the current window�s opener 
     theAPI = findAPI(window.opener); 
    } 
    // if the API has not been found 
    if (theAPI == null) 
    { 
     // Alert the user that the API Adapter could not be found 
     alert("Unable to find an API adapter"); 
    } 
    return theAPI; 
} 

Ahora, la API es probablemente encontrado, porque no recibo el mensaje "No se puede encontrar ...", el código procede a tratar de inicializarlo. Pero firebug me dice API.LMSInitialize is not a function, y si trato de depurarlo con alert(Object.getOwnPropertyNames(API));, me da una alerta en blanco.

¿Qué me estoy perdiendo?

+1

¿Qué se obtiene cuando se acaba de hacer un 'console.log (API)' derecha después de 'API = getAPI();'? – m90

+0

por favor, ¿me puede decir lo que quiere hacer después de la iniciación ... –

Respuesta

11

Su función LMSInitialize se declara dentro de la función Scorm_API_12. Por lo tanto, solo se puede ver en el alcance de la función Scorm_API_12.

Si desea utilizar esta función como API.LMSInitialize(""), declarar Scorm_API_12 función como esta:

function Scorm_API_12() { 
var Initialized = false; 

this.LMSInitialize = function(param) { 
    errorCode = "0"; 
    if (param == "") { 
     if (!Initialized) { 
      Initialized = true; 
      errorCode = "0"; 
      return "true"; 
     } else { 
      errorCode = "101"; 
     } 
    } else { 
     errorCode = "201"; 
    } 
    return "false"; 
} 

// some more functions, omitted. 
} 

var API = new Scorm_API_12(); 
+3

Aha! Eso es lo que sucede cuando un copiar/pegar sale mal. ¡Gracias! – SaltyNuts

10

Para más genérica consejos sobre la depuración de este tipo de problema MDN tener un buen artículo TypeError: "x" is not a function:

It was attempted to call a value like a function, but the value is not actually a function. Some code expects you to provide a function, but that didn't happen.

Maybe there is a typo in the function name? Maybe the object you are calling the method on does not have this function? For example, JavaScript objects have no map function, but JavaScript Array object do.

Básicamente el objeto (todas las funciones en js también son objetos) no existe donde crees que lo hace. Esto podría ser por numerosos razones incluyendo (no es una lista extensa):

  • Missing galería de scripts
  • Typos
  • La función está dentro de un ámbito que actualmente no tiene acceso a, por ejemplo, :

var x = function(){ 
 
    var y = function() { 
 
     alert('fired y'); 
 
    } 
 
}; 
 
    
 
//the global scope can't access y because it is closed over in x and not exposed 
 
//y is not a function err triggered 
 
x.y();

  • Su objeto/función no tiene la función de su vocación:

var x = function(){ 
 
    var y = function() { 
 
     alert('fired y'); 
 
    } 
 
}; 
 
    
 
//z is not a function error (as above) triggered 
 
x.z();

+1

Me gustaría agregar: nombrar una variable local lo mismo que una función, por lo que cuando se llama a 'showOrderForm()' el tipo de 'showOrderForm' es un booleano. – Noumenon

Cuestiones relacionadas