Javascript 定义了两个导致错误的自调用匿名函数

Javascript 定义了两个导致错误的自调用匿名函数,javascript,gulp,Javascript,Gulp,我有两个自调用函数,但出现了一个错误 Uncaught TypeError: undefined is not a function 代码: (function(){ //a.min.js console.log('main') })() (function(){ //b.min.js console.log('two') })() 感谢大家提供的解决方案,但我想知道,如果通过一些自动化工具(如gulp)进行连接和缩小,如何解决这个问题 (function(){

我有两个自调用函数,但出现了一个错误

Uncaught TypeError: undefined is not a function
代码:

(function(){  //a.min.js
    console.log('main')
})()

(function(){ //b.min.js
    console.log('two')
})()

感谢大家提供的解决方案,但我想知道,如果通过一些自动化工具(如gulp)进行连接和缩小,如何解决这个问题

(function(){
    console.log('main')
})();

(function(){
    console.log('two')
})();

这使得第一个IIFE被解释为未关闭,而第二个代码块在被解释为第一个IIFE的参数时创建了一个错误。

问题是这被解释为

(expression)(args to call function with)(args to call function)(args to call function)
你真正想要的是

(expression)(args to call function with)(expression)(args to call function)
唯一的方法是用分号打断期望

(expression)(args to call function with);(expression)(args to call function)
或者,您可以使用不太标准的

!function(){
 console.log('main')
}()

!function(){
 console.log('two')
}()

解决此问题的一种方法是不使用分号,将每个IIFE包装在一个块中:

{(function(){
    console.log('main')
})()}

{(function(){
    console.log('two')
})()}
或者更简单地说,将两者结合起来:

(function(){
    console.log('main')
    console.log('two')
})()
最后一个选项是将所有IIFE放入一个数组中,然后依次调用它们:

[
    function(){
        console.log('main')
    },

    function(){
        console.log('two')
    }
].forEach(function (fn) { fn() })

如果您需要大量的分号,最后一个可能会很好,但再次强调,如果可能的话,最好是合并。

为什么分号,它们在不同的行上,然后我会有另一个问题,我使用gulp进行缩小,我不能强制分号,因为这是唯一的解决方法。问题是失踪的人semicolons@user3610227:换行符不分隔语句。只有分号可以。下面是您的示例的简化版本,使用函数引用:
(foo)((bar)(
)。明白了,但是假设第一个iLife在a.min.js中,第二个在b.min.js中,两者都通过gulp、@user3610227缩小:您可以在每个源文本的末尾自动插入分号。或者使用类似的方法。