2010-10-26 16 views
72

Código es el siguiente:Javascript "TypeError no detectada: objeto no es una función" cuestión asociatividad

<body> 
    <a href="javascript:;" id="test">hello</a> 
</body> 

<script type="text/javascript"> 
    document.getElementById("test").addEventListener("click", function() { 
     test() 
    }, false) 
    function test() { 
     var postTypes = new Array('hello', 'there') 
     (function() { alert('hello there') })() 
    } 
</script> 

Esto generará un "TypeError no detectada: objeto no es una función". Si envuelvo la llamada/invocación de la función anónima en otro conjunto de paréntesis, ejecutará la alerta, pero aún así me dará un error. Si pongo un punto y coma después de la definición de "var postTypes", entonces estará completamente bien.

Me hicieron creer que javascript no requiere punto y coma, así que estoy adivinando que hay algunas reglas de asociación de funciones extrañas que no entiendo del todo. Espero que alguien pueda darme la respuesta a por qué estoy recibiendo este error.

Gracias.

+0

Parece casi como si estuviera intentando crear una función anónima y una función estática y espera que se ejecute como una sola. Qué sucede si elimina la función() – brumScouse

Respuesta

73

Javascript requiere punto y coma, es solo que la interpretación se lo insertará en los saltos de línea cuando el código pase a ser un error de sintaxis sin él *.

Por desgracia, el código

var a = new B(args)(stuff)() 

es no un error de sintaxis, por lo que no se insertará ;. (Un ejemplo que puede funcionar es

var answer = new Function("x", "return x")(function(){return 42;})(); 

)

Para evitar sorpresas como esta, entrenarse para terminar siempre una declaración con ;.

(*:.... Sólo un pulgar regla no siempre se cumple la regla de inserción es mucho más complicado Este blog page acerca de la inserción de punto y coma tiene más detalle)

+10

O bien: para evitar sorpresas como esta, prepárese para escribir un código limpio legible (que siempre debería aplicarse) y conozca las reglas ASI generales ... realmente no es diferente a "saber" cómo cierran en JS trabajo. –

15

Su código experimenta un caso en que el Automatic Semicolon Insertion (ASI) el proceso no sucede.

Nunca confíe en ASI. Debe usar punto y coma para separar correctamente las instrucciones:

var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!! 

(function() { alert('hello there') })(); 

Su código en realidad estaba tratando de invocar el objeto de la matriz.

+0

Una forma de solucionar el problema, pero no puedo ponerme detrás del club de Crockford. –

+1

@pst: Permítanme reformular, no estoy en el club de Crock * en absoluto * :) – CMS

+8

@pst: creo que disfrutarán este cuestionario: http://asi.qfox.nl/;) – CMS

7

Recibí un error similar y me tomó un tiempo darme cuenta de que en mi caso nombré la variable de matriz payInvoices y la función también payInvoices. Confundió AngularJs. Una vez que cambié el nombre a processPayments() finalmente funcionó. Solo quería compartir este error y solución, ya que me tomó mucho tiempo resolver esto.

+0

Lo mismo aquí, tenía una variable llamada 'alerta' e intentaba llamar a la función de alerta de JavaScript y decía 'la alerta no es una función'. Intentaba llamar a la variable 'alert' en lugar de a la función real – James111

0

Trate de tener el cuerpo de la función antes de la llamada a la función en su archivo JavaScript.

Cuestiones relacionadas