Подтвердить что ты не робот

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

Что я сделал не так?

4b9b3361

Ответ 1

Ошибка является результатом отсутствия точки с запятой в третьей строке:

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);

Ответ 2

**Error Case:** 
var userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

Вывод: TypeError: (промежуточное значение) (промежуточное значение) не является функцией

* Как это исправитьпотому что вы пропускаете точку с запятой (;) для разделения выражений;

**Fixed**
var userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}; //(if miss that semi colan ..occurs error)

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

Ответ 3

Сделать правила точки с запятой простыми

Каждая строка, начинающаяся с (, [, 'или любого оператора (/, +, - являются единственными допустимыми), должна начинаться с точки с запятой.

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

monstrocity.

Дополнительное примечание

Чтобы упомянуть, что произойдет: скобки будут индексироваться, скобки будут рассматриваться как параметры функции. Обратный удар преобразуется в тегированный шаблон, а регулярные выражения или целые числа с явной подписью превратятся в операторы. Конечно, вы можете просто добавить точку с запятой в конце каждой строки. Хорошо иметь в виду, когда вы быстро создаете прототипы и отбрасываете точки с запятой.

Кроме того, добавление точек с запятой в конце каждой строки не поможет вам в следующем, поэтому имейте в виду такие утверждения, как

return // Will automatically insert semicolon, and return undefined.
    (1+2);
i // Adds a semicolon
   ++ // But, if you really intended i++ here, your codebase needs help.

В приведенном выше случае произойдет возврат/продолжить/прервать/++ / -. Любой линтер поймает это с помощью мертвого кода или синтаксической ошибки ++/(++ / - никогда не произойдет).

Наконец, если вы хотите, чтобы конкатенация файлов работала, убедитесь, что каждый файл заканчивается точкой с запятой. Если вы используете программу-упаковщик (рекомендуется), она должна сделать это автоматически.

Ответ 4

  **Error Case:**

var handler = function(parameters) {
  console.log(parameters);
}

(function() {     //IIFE
 // some code
})();

Вывод: TypeError: (промежуточное значение) (промежуточное значение) не является функцией * Как исправить IT → потому что отсутствует разделитель (;) для разделения выражений;

 **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

Ответ 5

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

Ответ 6

Для меня это было намного проще, но мне потребовалось время, чтобы понять это. Мы в основном были в нашем .jslib

some_array.forEach(item => {
    do_stuff(item);
});

Оказывается, Unity (emscripten?) Просто не нравится этот синтаксис. Мы заменили его на старый добрый цикл, и он сразу перестал жаловаться. Я действительно ненавижу это, потому что это не показывает линию, на которую это жалуется, но так или иначе, обмануть меня дважды позор для меня.