解释了自执行函数语法和回调语法
Self-executing function syntax and callback syntax explained
这个问题可能有点傻。
但我想了解为什么自执行函数及其回调的语法与所有其他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具有函数范围而不是块范围,并且通过引用在闭包中传递值。您可以在立即调用的函数表达式中进一步了解这一点。
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 在回调函数中呈现 Meteor 检索到的数据的正确语法是什么
- 在 NodeJS 中放置回调的语法和方法
- 运行函数“getBgColors”作为addListener回调的正确语法是什么
- 角度组件语法,回调函数使用错误的上下文调用
- 内联JS回调语法与内部JS回调语法
- 解释了自执行函数语法和回调语法
- 试着理解回调函数中的语法是如何工作的
- javascript回调演示中的语法错误
- Javascript语法:嵌套回调
- 什么是正确的函数回调语法
- Typescript语法angular2承诺然后回调