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(!)语法。