解释了自执行函数语法和回调语法

Self-executing function syntax and callback syntax explained

本文关键字:语法 回调 函数 执行 解释      更新时间:2023-09-26

这个问题可能有点傻。

但我想了解为什么自执行函数及其回调的语法与所有其他JS语法如此不同。。

(function () {
})()

我只需要理解为什么用()封装它是有效的——我不会猜到这是有效的,然后是回调的额外()(它就在它的正后面,我也不会预料到这是无效的。

有人能向我解释吗?

function (...) {...}部分是函数表达式,即表示函数的表达式。在这种情况下,它必须用括号括起来的唯一原因是,如果关键字function是语句中的第一个内容,则该语句被假定为函数语句,即函数声明。(实际上,它不一定要用括号括起来;它还可以在它前面加一个+,或者通常在function之前放任何类型的标记,以防止函数语句解释。)

函数表达式之后的()部分与用于调用函数的正常()相同。此:

(function (...) {...})(...);

(除了临时变量)与以下内容相同:

var f = function (...) {...};
f();

相当于:

function f(...) {...};
f();

本质上,外圆括号允许函数对象被完全解释和实例化,因此一旦退出这些圆括号的作用域,函数对象就可以被调用了。

请参阅此处:

  • 为什么需要在同一行调用一个匿名函数

当像您所做的那样声明时,您将其用作函数表达式(从上面的链接定义函数的第三种方法)。与任何表达式一样,此(expression)的计算结果为表达式-此处使用括号是为了在必要时建立优先级。所以你可以写这个例子:

var f = function(a) {
    var s = (((( 1 )))) + (((( a ))));
    console.log(s);
};
((((( f ))))) (2);

(实际示例),然后删除所有不必要的括号,得到相同的结果(本质上是打印1 + 2 = 3)。结果:

(function(...) { ... }) 

是一个接受一些参数并具有要执行的主体的函数。此:

(function(...) { ... })()

相当于:

var f = (function(...) { ... });
// Now f is a function that can be called
f();

匿名函数之所以有用,有两个原因——它们是匿名的(即它们不创建额外的名称——请再次参阅上面的SOq链接),它们是其他不需要全局的东西的"容器"。

这里有一个立即调用的函数表达式,也称为IFFE(读iffy),是一种使用JS函数作用域生成词法作用域的设计模式。这些用于避免可变吊装,污染全球环境,同时允许公众访问方法,同时保留函数中声明的变量的局部隐私。理解这一点的关键是JS具有函数范围而不是块范围,并且通过引用在闭包中传递值。您可以在立即调用的函数表达式中进一步了解这一点。