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   51   2017-02-04 07:05:23

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, и он сразу же перестал жаловаться. Я действительно ненавижу это, что он не показывает линию, на которую он жалуется, но в любом случае, Обманите меня дважды позорьте меня.