Uncaught TypeError: (промежуточное значение) (...) не является функцией
все работает нормально, когда я написал логику js в закрытии как один файл js, как:
(function(win){
//main logic here
win.expose1 = ....
win.expose2 = ....
})(window)
но когда я пытаюсь вставить альтернативную функцию ведения журнала до этого закрытия в тот же файл 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)
он жалуется, что есть TypeError:
Uncaught TypeError: (intermediate value)(...) is not a function
что я сделал не так?
6 ответов:
ошибка является результатом отсутствия точки с запятой в третьей строке:
window.Glog = function(msg) { console.log(msg); }; // <--- Add this semicolon (function(win) { // ... })(window);спецификация ECMAScript имеет специальные правила для автоматической вставки точки с запятой, однако в этом случае точка с запятой не вставляется автоматически, поскольку выражение в скобках, начинающееся со следующей строки, может быть интерпретировано как список аргументов для вызова функции.
это означает, что без этой точки с запятой, анонимный
window.Glogвызывалась функция с функцией какmsgпараметр, за которым следует(window)который впоследствии пытался вызвать все, что было возвращено.вот как интерпретировался код:
window.Glog = function(msg) { console.log(msg); }(function(win) { // ... })(window);
**Error Case:** var userListQuery = { userId: { $in: result }, "isCameraAdded": true } ( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;вывод: TypeError: (промежуточное значение) (промежуточное значение) не является функцией
*как это исправить - > потому что вам не хватает semi colan (;) для разделения выражений;
**Fixed** var userListQuery = { userId: { $in: result }, "isCameraAdded": true }; //(if miss that semi colan ..occurs error) ( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
**Error Case:** var handler = function(parameters) { console.log(parameters); } (function() { //IIFE // some code })();выход: TypeError: (промежуточное значение) (промежуточное значение) не является функцией *Как это исправить - > потому что вам не хватает semi colan (;) для разделения выражений;
**Fixed** var handler = function(parameters) { console.log(parameters); }; // <--- Add this semicolon(if you miss that semi colan .. //error will occurs ) (function() { //IIFE // some code })();почему эта ошибка происходит?? Причина : специальные правила для автоматической вставки точки с запятой, которая дается ES6 stanards
я столкнулся с этой проблемой, когда я создал новый класс ES2015, где имя свойства было равно имени метода.
например:
class Test{ constructor () { this.test = 'test' } test (test) { this.test = test } } let t = new Test() t.test('new Test')обратите внимание, что эта реализация была в NodeJS 6.10.
в качестве обходного пути (если вы не хотите использовать скучное имя метода setTest), вы можете использовать префикс для своих "частных" свойств (например,
_test).откройте инструменты разработчика в jsfiddle.
чтобы сделать правила с запятой простыми
каждая строка, которая начинается с
(,[,`, или любой оператор (/, +, - единственные допустимые), должен начинаться с точки с запятой.
func() ;[0].concat(myarr).forEach(func) ;(myarr).forEach(func) ;`hello`.forEach(func) ;/hello/.exec(str) ;+0 ;-0это предотвращает
func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0чудовище.Дополнительная Информация
чтобы упомянуть, что произойдет: скобки будут индексироваться, скобки будут рассматриваться как параметры функции. Обратная палочка превратится в tagged template, и регулярное выражение или явно подписанные целые числа превратятся в операторы.
добавить точку с запятой в конце каждой строки не поможет вам, так что имейте в виду высказывания типа
return // Will automatically insert semicolon, and return undefined. (1+2); i // Adds a semicolon ++ // If you really intended i++, you need help.в приведенном выше случае произойдет возврат / продолжение / перерыв/++/--. Любой Линтер поймает это с помощью мертвого кода или синтаксической ошибки ++ / -- (++/--никогда не будет реально происходить без опечатки). Единственный несвязанный вариант -
i ++ (b)что бы произойдет, если вы хотели (i++)(b), а вместо этого получили i; ++(b). Это также будет невозможно, поскольку (i++) (b) никогда не будет реально задумано.
наконец, если вы хотите, чтобы конкатенация файлов работала, убедитесь, что каждый файл заканчивается точкой с запятой. Если вы используете программу bundler, она должна делать это автоматически.
для меня это было гораздо проще, но мне потребовалось некоторое время, чтобы понять это. Мы в основном имели в нашем .jslib
some_array.forEach(item => { do_stuff(item); });получается Unity (emscripten?) просто не нравится этот синтаксис. Мы заменили его на старый добрый for-loop, и он сразу же перестал жаловаться. Я действительно ненавижу это, что он не показывает линию, на которую он жалуется, но в любом случае, Обманите меня дважды позорьте меня.
Comments