未捕获的TypeError :(中间值)(...)不是函数

时间:2017-02-04 04:05:24

标签: javascript 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

我做错了什么?

8 个答案:

答案 0 :(得分:186)

错误是第三行缺少分号的结果:

window.Glog = function(msg) {
  console.log(msg);
}; // <--- Add this semicolon

(function(win) {
  // ...
})(window);

ECMAScript规范有specific rules for automatic semicolon insertion,但是在这种情况下,分号不会自动插入,因为从下一行开始的括号表达式可以解释为函数调用的参数列表。

这意味着如果没有该分号,则使用函数作为window.Glog参数调用匿名msg函数,然后调用(window),后来尝试调用返回的内容。

这是代码的解释方式:

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);

答案 1 :(得分:5)

错误案例:

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

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

<强>输出:

TypeError: (intermediate value)(intermediate value) is not a function

修复:您缺少分号(;)来分隔表达式

userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}; // Without a semi colon, the error is produced

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

答案 2 :(得分:2)

使分号规则变得简单

([,`或任何运算符(/,+,-是唯一有效的运算符)开头的每一行都必须以分号开头。

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,而regex或显式签名的整数将转换为运算符。当然,您可以在每行末尾添加一个分号。不过,当您快速进行原型制作并放弃分号时,请紧记一下。

此外,在每行末尾添加分号对您的操作无济于事,因此请牢记诸如此类的语句

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.

上述情况将发生在return / continue / break / ++ /-。任何短毛猫都会遇到死代码或++ /-语法错误(++ /-绝对不会发生)。

最后,如果您希望文件串联有效,请确保每个文件都以分号结尾。如果您使用捆绑程序(推荐),它将自动执行此操作。

答案 3 :(得分:1)

对我来说这简单得多,但我需要一段时间来弄明白。我们基本上有.jslib

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

原来Unity(emscripten?)就是不喜欢那种语法。我们用一个很好的老式for-loop替换它,它立即停止抱怨。 我真的很讨厌它没有表现出它抱怨的那条线,但无论如何,愚弄我两次羞辱我。

答案 4 :(得分:0)

  **Error Case:**

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

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

输出:TypeError :(中间值)(中间值)不是函数 *如何修复IT - &gt;因为你缺少半可乐(;)来分隔表达式;

 **Fixed**


var handler = function(parameters) {
  console.log(parameters);
}; // <--- Add this semicolon(if you miss that semi colan .. 
   //error will occurs )

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

为什么会出现这个错误?   原因:  specific rules for automatic semicolon insertion which is given ES6 stanards

答案 5 :(得分:0)

当我创建一个新的ES2015类时,我遇到了这个问题,其中属性名称等于方法名称。

例如:

class Test{
  constructor () {
    this.test = 'test'
  }

  test (test) {
    this.test = test
  }
}

let t = new Test()
t.test('new Test')

请注意,此实现在NodeJS 6.10中。

作为一种解决方法(如果您不想使用枯燥的&#39; setTest&#39;方法名称),您可以为您的私人&#39;使用前缀。属性(如_test)。

jsfiddle

中打开您的开发者工具

答案 6 :(得分:0)

创建根类时,我使用箭头函数定义了其方法。在继承和覆盖原始函数时,我注意到了同样的问题。

class C {
  x = () => 1; 
 };
 
class CC extends C {
  x = (foo) =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));

这是通过定义不带箭头功能的父类的方法来解决的

class C {
  x() { 
    return 1; 
  }; 
 };
 
class CC extends C {
  x = foo =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));

答案 7 :(得分:0)

我在这种情况下遇到了同样的问题:

let brand, capacity, color;
let car = {
  brand: 'benz',
  capacity: 80,
  color: 'yellow',
}

({ color, capacity, brand } = car);

; 声明的末尾只有一个 car 错误消失了:

let car = {
  brand: 'benz',
  capacity: 80,
  color: 'yellow',
}; // <-------------- here a semicolon is needed

实际上,在({ color, capacity, brand } = car);之前需要看到分号。