Javascript匿名函数调用

Kon*_*ter 53 javascript anonymous-function

当我遇到调用匿名函数的奇怪方式时,我正在阅读Twitter上的JS源代码 - 在改进我的JS知识库的过程中:

!function( $ ) {
    ...
}( window.jQuery );
Run Code Online (Sandbox Code Playgroud)

......这有效!:)

对每个人来说,显而易见的是:

function ( $ ) { ... } ( window.jQuery )
Run Code Online (Sandbox Code Playgroud)

不起作用(语法错误),而这一个是正确的:

(function ( $ ) { .... })( window.jQuery )
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个魔术(为什么案例与!function作品)?

Fel*_*her 73

function在语句位置(作为语句中的第一个标记)满足关键字时,函数声明表示为函数语句.函数语句被提升到作用域的顶部,不能立即调用并且必须具有名称.

当在表达式位置满足关键字时(即不作为语句中的第一个标记,在您的示例中!是第一个标记),函数声明表示为函数表达式,它可以是匿名的并返回新值创造了功能.由于它返回新创建的函数的值,因此可以通过在其后面添加括号来立即调用它.

将括号内的声明包装起来是相同的,但比使用!or或前缀更为常见+.

(function () {
    ...
}());
Run Code Online (Sandbox Code Playgroud)

  • 可能他们用过了!而不是将其包装在()中,因为它使用的字符数减少了50%.:)减少通过电线=更快的加载时间. (3认同)

nim*_*odm 8

第二种形式function () {}声明.的!操作者转换为这个表达式.您还可以找到人们使用-+function关键字之前使用的案例.

当您有一个表达式求值函数时,可以使用()运算符调用该函数.

另一种(可能更容易理解)实现保存相同效果的方法是使用另一组括号:

( function(x) { body; } )(arg);
Run Code Online (Sandbox Code Playgroud)

通过将函数放在括号内,您再次将其转换为表达式,该表达式求值为函数.使用此函数arg作为参数调用.