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