2012-02-01 148 views
44

我读我的方式来提高我的JS的知识基础,当我遇到了奇怪的方式打来电话匿名函数的来自Twitter — JS来源:的Javascript匿名函数调用

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

...这作品! :)

这是有目共睹的,是这样的:

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

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

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

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

+1

见http://benalman.com/news/2010/11/immediately-invoked-function-expression/其他有效IIFE模式。 – 2012-02-01 05:52:07

+1

@AtesGoral,谢谢,这篇文章非常有用。 – 2012-02-01 06:01:03

回答

61

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

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

结束语在括号内声明时相同,但更常见比前缀它!+

(function() { 
    ... 
}()); 
+3

大概他们用过了!而不是将其封装在()中,因为它使用的字符数减少了50%。 :)减去电线=更快的加载时间。 – jinglesthula 2014-02-13 21:19:27

0

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

你的问题可能是你的匿名函数里面有一个错误。

+4

只是尝试评估'功能(一){警报(一); }(5); ' - 你会得到错误。然后用'!function'替换'function'并重试。另请注意,'(函数(a){...})(5)'和'(函数(a){...}(5))'成功工作。 – 2012-02-01 05:50:22

6

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

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

其它的(也许更容易理解)的方式来达到节省同样的效果是与另一组括号:再次

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

将函数的括号内,将其转换为一个表达式,其评估到一个功能。该函数以arg作为参数来调用。

0

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

命名函数可能是一个但是,一个匿名函数只是把它看作一个表达式。

临: 你可以做function() { ... }()

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

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