Todo funciona bien cuando escribí la lógica js en un cierre como un solo archivo js, como:
(function(win){ //main logic here win.expose1 = .... win.expose2 = .... })(window)pero cuando trato de insertar una función alternativa de registro antes de ese cierre en el mismo archivo js,
window.Glog = function(msg){ console.log(msg) } // this was added before the main closure. (function(win){ //the former closure that contains the main javascript logic; })(window)se queja de que hay un TypeError:
Uncaught TypeError: (intermediate value)(...) is not a function¿Qué hice mal?
El error se debe a que falta el punto y coma en la tercera línea:
window.Glog = function(msg) { console.log(msg); }; // <--- Add this semicolon (function(win) { // ... })(window);La especificación ECMAScript tiene reglas específicas para la inserción automática de punto y coma , sin embargo, en este caso, un punto y coma no se inserta automáticamente porque la expresión entre paréntesis que comienza en la línea siguiente puede interpretarse como una lista de argumentos para una llamada de función.
Esto significa que sin ese punto y coma, la función anónima window.Glog se invocaba con una función como parámetro msg , seguida de (window) que posteriormente intentaba invocar lo que se devolviera.
Así es como se estaba interpretando el código:
window.Glog = function(msg) { console.log(msg); }(function(win) { // ... })(window); Cada línea que comienza con ( , [ , `, o cualquier operador aritmético, debe comenzar con un punto y coma si desea que se interprete como su propia línea ~ De lo contrario, puede combinarse con la línea anterior por accidente. Todos los demás saltos de línea tienen punto y coma implícitos.
Eso es todo. Hecho.
Tenga en cuenta que /, +, - son los únicos operadores válidos para los que le gustaría hacer esto de todos modos. Nunca querrá que una línea comience con '*', ya que es un operador binario que nunca podría tener sentido al comienzo de una línea.
Debe poner los puntos y comas al principio de la línea al hacer esto. No debe intentar "arreglar" el problema agregando un punto y coma a la línea anterior , o cualquier reordenación o movimiento del código hará que el problema se manifieste potencialmente nuevamente. Muchas de las otras respuestas (incluidas las respuestas principales) hacen esta sugerencia, pero no es una buena práctica.
Considera lo siguiente:
func() ;[0].concat(myarr).forEach(func) ;(myarr).forEach(func) ;`hello`.forEach(func) ;/hello/.exec(str) ;+0 ;-0Al seguir las reglas dadas, evita que el código anterior se reinterprete como
func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0Para mencionar lo que sucederá: los corchetes se indexarán, los paréntesis se tratarán como parámetros de función. El acento grave se transformaría en una plantilla etiquetada , la expresión regular se convertiría en división y los enteros con signo +/- explícito se convertirían en operadores más/menos.
Por supuesto, puede evitar esto simplemente agregando un punto y coma al final de cada salto de línea, pero no crea que hacer esto le permitirá codificar como un programador de C. Dado que todavía ocurre que cuando no finaliza una línea con un punto y coma, Javascript podría agregar implícitamente uno en su nombre en contra de sus deseos. Por lo tanto, tenga en cuenta afirmaciones como
return // Implicit semicolon, will return undefined. (1+2); i // Implicit semicolon on this line ++; // But, if you really intended "i++;" // and you actually wrote it like this, // you need help.El caso anterior pasará a volver/continuar/romper/++/--. Cualquier linter detectará el primer caso con código muerto, o el último caso con ++/-- error de sintaxis.
Finalmente, si desea que funcione la concatenación de archivos, asegúrese de que cada archivo termine con un punto y coma. Si está utilizando un programa empaquetador (recomendado), debería hacerlo automáticamente.
Caso de error:
var userListQuery = { userId: { $in: result }, "isCameraAdded": true } ( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;Producción:
TypeError: (intermediate value)(intermediate value) is not a functionSolución: le falta un punto y coma (;) para separar las expresiones
userListQuery = { userId: { $in: result }, "isCameraAdded": true }; // Without a semi colon, the error is produced ( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;