【问题标题】:Javascript anonymous function call [duplicate]Javascript匿名函数调用[重复]
【发布时间】:2012-02-23 20:46:22
【问题描述】:

我正在阅读 Twitter 上的 JS 资源——在提高我的 JS 知识库的过程中,我遇到了调用匿名函数的奇怪方式:

!function( $ ) {
    ...
}( window.jQuery );

...这行得通! :)

这对每个人都很明显:

function ( $ ) { ... } ( window.jQuery )

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

(function ( $ ) { .... })( window.jQuery )

谁能解释一下这个魔法(为什么!function 有效)?

【问题讨论】:

标签: javascript anonymous-function


【解决方案1】:

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

当关键字在表达式位置遇到时(即不是作为语句中的第一个标记,在您的示例中! 是第一个标记),函数声明表示为函数表达式,它可能是匿名的,并返回新创建的函数的值。因为它返回的是新创建的函数的值,所以你可以立即通过在它后面加上括号来调用它。

将声明包装在括号内的效果相同,但比使用 !+ 前缀更常见:

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

【讨论】:

  • 可能他们用过!而不是将其包装在 () 中,因为它使用的字符减少了 50%。 :) 更少的网络连接 = 更快的加载时间。
【解决方案2】:

第二种形式function () {} 是一个语句! 运算符将其转换为 表达式。您还会发现人们在 function 关键字之前使用 -+ 的情况。

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

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

( function(x) { body; } )(arg);

通过将函数放在括号内,您可以再次将其转换为表达式,该表达式的计算结果为函数。此函数以arg 作为参数调用。

作为箭头函数:

( (x) => { body; } )(arg);

【讨论】:

    【解决方案3】:

    就感叹号而言,这不是魔术。 它将结果转换为真/假。

    您的问题可能是您的匿名函数内部有错误。

    【讨论】:

    • 尝试评估function (a) { alert(a); } (5); ——你会得到错误。然后将function 替换为!function 并重试。另请注意,(function(a) { ... })(5)(function(a) { ... }(5)) 成功工作。
    【解决方案4】:

    这听起来像是一个 javascript 语法错误:

    一个命名函数可以是一个语句,但是一个匿名函数只是把它当作一个表达式。

    专业版: 你可以做function() { ... }()

    缺点: 你不能这样做function() { ... }

    但是为什么人们想要定义一个匿名函数而不调用它呢?所以骗局并不是真正的问题。

    【讨论】:

    • function(){...}() 不起作用
    猜你喜欢
    • 2013-08-29
    • 2013-11-22
    • 1970-01-01
    • 2013-04-16
    • 2014-09-11
    • 2015-02-19
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多