TypeError有两个连续的自执行匿名函数

时间:2011-12-24 15:00:26

标签: javascript

这个问题的灵感来自the accepted answer here。为什么下面的代码警告“先”,然后是“秒”,然后出现TypeError错误?

(function() {
    alert('first');
}())


(function() {
    alert('second');
}())

给出的解释是第一个函数的返回值正在尝试调用。但为什么会这样呢? [另外,为什么在第一次自行执行后没有分号插入添加分号?]

3 个答案:

答案 0 :(得分:5)

没有分号,它将评估为:

(function() {
    alert('first');
}())(function() {
    alert('second');
}())

执行第一个函数,由于它不返回任何内容,因此会进一步评估:

undefined(function() {
    alert('second');
}())

然后执行第二个函数,它再次返回undefined,所以:

undefined(undefined)

当然不起作用(TypeError因为undefined不是函数)。单独的函数调用应该用分号分隔,因为每个语句实际应该是。

答案 1 :(得分:2)

ASI,自动分号插入。你的代码应该是这样编写的:

(function() {
    alert('first');
}()); //<--semicolon


(function() {
    alert('second');
}()); //<--semicolon

相反,这是采取的步骤:

(function() {
    alert('first');
}())


(function() {
    alert('second');
}())

//now, the interpreter guesses that you mean to concatenate the two
(function() {
    alert('first');
}())(function() {
    alert('second');
}());
//it also inserts a semi-colon where it should've appeared at the end of the script

//first function doesn't return anything === returns undefined
undefined(function() {
    alert('second');
}());

//second function doesn't return anything === returns undefined
undefined(undefined);
//however, the braces stay, since they can also mean function execution

undefined不是函数,因此无法执行,因此会出现TypeError。

答案 2 :(得分:1)

之所以发生这种情况,是因为这是解析程序的方式。我们可以将该计划作为

 (some stuff) (some more stuff)

很明显,这应该尝试将some stuff称为函数。当然,分号可以解决问题,你希望分号插入可以自动完成。在不知道详细的插入规则的情况下,我只想说没有插入任何内容,因为规则是专门设计的,不会改变其他明确定义的行为。

当然,您可能不会认为这种行为“定义明确”。但语言规则在任何情况下都不能很好地运作。