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

Javascript 未捕获的TypeError:(中间值)(…)不是函数,javascript,typeerror,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 c

当我将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)
它抱怨存在类型错误:

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

我做错了什么?

错误是由于第三行缺少分号造成的:

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

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

错误案例:

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

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
TypeError: (intermediate value)(intermediate value) is not a function
输出:

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;
输出:TypeError:(中间值)(中间值)不是函数 *如何修复->因为缺少分隔表达式的semicolan(;)

 **Fixed**


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

(function() {     //IIFE
 // some code
})();
**已修复**
变量处理程序=函数(参数){
console.log(参数);

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

e、 g:

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

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

let t = new Test()
t.test('new Test')
请注意,这个实现是在NodeJS 6.10中实现的

作为一种解决方法(如果您不想使用枯燥的“setTest”方法名),可以为“private”属性使用前缀(如
\u test


在中打开开发人员工具。

对我来说,这要简单得多,但我花了一段时间才弄明白。基本上,我们在.jslib中

some_array.forEach(item=>{
做事(项目);
});
原来Unity(emscripten?)就是不喜欢这种语法。我们用一个很好的旧for循环替换了它,它立刻停止了抱怨。 我真的很讨厌它没有显示出它所抱怨的那条线,但不管怎样,欺骗我两次真让我感到羞耻。

简化分号规则 以
[
,`,或任何运算符(/,+,-是唯一有效的运算符)开头的每一行必须以分号开头,以解释为自己的行。所有其他换行符都是隐式的

就这样,完成了


为什么? 考虑以下几点:

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
附加说明 提到将发生的情况:括号将索引,括号将被视为函数参数。反勾号将转换为a,正则表达式将转换为除法,显式+/-符号整数将转换为加减运算符

当然,您可以通过在每个换行符的末尾添加分号来避免这种情况,但即使这样做也不会总是对您有所帮助,因为当您不以分号结尾一行时,它可能会代表您隐式添加一个分号

return       // Implicit semicolon, will return undefined.
    (1+2);

i        // Implicit semicolon on this line
   ++;   // But, if you intended "i++;" and you wrote it like this,
         // you need help.
上述情况将发生在return/continue/break/++/--。任何linter都会用死代码或+/--语法错误捕捉到这一点(+++/--实际上永远不会发生)


最后,如果您希望文件连接起作用,请确保每个文件都以分号结尾。如果您使用的是捆绑程序(推荐),它应该自动执行此操作。

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

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

在这种情况下,我面临同样的问题:

让品牌、容量、颜色;
出租汽车={
品牌:“奔驰”,
容量:80,
颜色:'黄色',
}
({颜色、容量、品牌}=汽车);
只需在
汽车
声明末尾添加一个
,错误就消失了:

let car={
品牌:“奔驰”,
容量:80,
颜色:'黄色',

}/@阿姆诺斯特朗·乔希跑得更快,答案是一样的:)谢谢你,先生!我的linter自动删除了分号,所有东西都坏了:)太棒了!!!太谢谢你了!!这一次我几乎掉光了头发…我的朋友,这是金色的!这太疯狂了,我非常感谢这篇文章。我在React
useEffect()中的
if
语句后设置状态
函数,当我不断收到此消息时“…不是函数”错误。我猜你的问题与此有关。这与问题所涉及的情况不同。@CherryDT不是,因为我得到的错误与此完全相同。不,此问题是关于由于语句和
在下一行。我在你的案例中看不到这一点。问题不仅仅包括标题!这与问题的内容不同。
函数。bind
也需要这种策略——谢谢这回答了你的问题吗?