Javascript 自调用匿名函数解析问题

Javascript 自调用匿名函数解析问题,javascript,Javascript,我很难理解这两条线是如何相互变化的 ( function() { return console.log("anon inner 1"); } ) (); // ^^ invoke ( function() { return console.log("anon inner 2"); } () ); //

我很难理解这两条线是如何相互变化的

( function() { return console.log("anon inner 1"); } ) ();
//                                                     ^^ invoke

( function() { return console.log("anon inner 2"); } () );
//                                                   ^^ invoke
在第一行中,我们有一个匿名内部函数,它被包装在括号中,然后立即被调用。第二行,我们有一个匿名的内部函数,它被调用,然后用括号括起来


我想我的问题是,括号中的包装是做什么的?它是否将事物对象化,即将事物转化为对象?

当您有一个常规的annon函数时,如:

function() { alert('testing'); }
这是一个函数表达式。任何其他变量称为函数声明,如下所示:

function a() { alert('testing'); }
!function() { alert('testing'); }
var a = function { alert('testing'); }
(function() { alert('testing'); })
现在不能调用函数表达式,因为它不返回值,但是声明可以。因此,您所需要做的就是以某种方式将其切换到声明以立即调用,这就是paren所做的,无论它们是否包装调用paren。这是因为一旦js解析器看到一个打开的parens,它就会将它变成一个声明

免责声明:我可能混淆了声明表达式的术语

JavaScript有一个函数,这是声明函数的“标准”方式,语法如下:

function name([param1, 2...]) {
   statements
}
还有一个函数,它看起来与function语句相同,只是名称是可选的,它本身并不是一个语句,而是一个表达式,如下两个示例所示:

// declare variable name that references a function created by expression
var name = function([param1, 2...]) { statements };
// call someOtherFunction that expects a function as a parameter
someOtherFunction(function() { });
(使用函数表达式还有很多其他方法。)

如果您试图在一行中单独使用匿名函数,而不将其括在括号中,则它将被视为函数语句,因此会出现语法错误,因为没有名称。将其括在括号中意味着它将在括号内被视为表达式,而不是语句,因此名称是可选的。如果将函数表达式的结果赋给变量或以其他方式使用它(如上面的示例),则不需要括号

所以(最后)开始问题中提到的语法:一旦你有了paren,你的函数被当作一个表达式,你可以使用你发布的两个语法中的任何一个来调用它。第一个,在参数“外部”调用意味着第一组参数将作为表达式的值进行计算,表达式的值正好是一个可以调用的函数。第二,invoke“inside”意味着函数表达式将被调用,然后周围的参数将计算为函数返回的任何值

无论哪种方式,函数的返回值都会被丢弃,因为您没有将其分配给任何对象


(最后一点注意:函数表达式可以有一个名称,以便函数可以递归地调用自己。)

请参阅更多:另外,请注意,
function a(){}
表单将自身提升到定义它的范围的顶部,并将覆盖任何变量,例如
var a=0
。示例:控制台应显示一个
TypeError
,因为它试图将数字0作为函数调用。谢谢,Jim!只是看了一下JSFIDLE,它确实抛出了那个错误。事实上,今晚我刚刚学到了这个概念,因为我正在观看《JavaScript第3部分》中的Crockford,他在一开始就谈到了这一点。事实上,他的一个例子让我提出了这个问题。谢谢正如您在免责声明中所说,您对“声明”和“表达”的使用有点混淆。最后两个函数“声明”实际上是表达式。
var a=…
语法意味着“声明变量
a
,并将其赋值以引用右侧的函数表达式”。我不确定not(!)语法。