自调用匿名函数解析问题

self-invoking anonymous function parsing issue

本文关键字:问题 函数 调用      更新时间:2023-09-26

我很难理解这两行是如何可以互换的。

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

在第一行,我们有一个匿名的内部函数,它被包裹在圆括号中,然后立即被调用。第二行,我们有一个匿名的内部函数,它被调用,然后用圆括号括起来。

我想我的问题是,在括号中的包装做什么?它是否客观化了事物,也就是把事物变成了客体?

JavaScript有一个function 语句,这是声明函数的"标准"方式,语法为:

function name([param1, 2...]) {
   statements
}

还有一个函数操作符,它看起来与函数语句相同,只是名称是可选的,并且它不单独用作语句,而是在需要表达式的地方使用,如下两个示例:

// 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() { });

(有很多其他方法可以使用函数表达式。)

如果您尝试在一行中单独使用匿名函数而不将其包装在括号中,则会将其视为函数语句,因此会出现语法错误,因为没有名称。将其括在括号中意味着它将被视为父级中的表达式,而不是语句,因此name是可选的。如果你将函数表达式的结果赋值给一个变量,或者以其他方式使用它(就像我上面的例子),那么你不需要括号。

所以得到(最后)在问题中提到的语法:一旦你有父母和你的函数被视为一个表达式,你可以使用你发布的两种语法中的任何一种来调用它。首先,调用"外部"父级意味着第一组父级将被计算为具有内部表达式的值,这恰好是您可以调用的函数。第二个,调用"inside"意味着函数表达式将被调用,然后周围的父元素将被求值为函数返回的任何值。

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

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

当你有一个常规的nonfunction,如:

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

它是一个函数表达式。任何其他变量都称为函数声明,如下所示:

function a() { alert('testing'); }
!function() { alert('testing'); }
var a = function { alert('testing'); }
(function() { alert('testing'); })

现在函数表达式不能被调用,因为它不返回值,但是声明可以。因此,您所需要做的就是以某种方式将其切换到声明以立即调用,这就是父类所做的,无论它们是否包装调用父类。这是因为js解析器一旦看到一个开父括号,就会把它变成声明

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