32

可能重复:
函数前的感叹号有什么作用?

如果您查看KnockoutJS 2.1.0 的源代码,您会看到从第 7 行开始的代码结构如下:

!function(factory) { ... }(factoryDefinition);

not 运算符导致此表达式的计算结果为true而不是undefined,但为什么要麻烦呢?

4

2 回答 2

55

这是形成立即执行的函数表达式的简洁方式。

传统上,人们使用这两种形式

(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use

如果您尝试仅使用

function(){ }(); // Syntax error

这将是一个语法错误,因为它被解释为函数声明而不是表达式。这就是为什么您需要将函数包装在括号中的原因。

但是如果你在函数声明之前放置一个一元运算符,你就不必添加一个括号,它会砍掉代码的一个字符,这是一个(非常)微小的性能优势。有几个一元运算符可用于同一目的

!function(){ }();
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 
于 2012-08-11T15:37:20.483 回答
3

因为如果你不做某事,那么它看起来像一个语法错误:

function(factory) { ... }(factoryDefinition);

试试看。

有必要让解析器到达它期望表达式的位置,以便function在该上下文中识别关键字。否则,当解析器看到function语句中的第一个标记时,它需要一个简单的函数声明,并且后面不能跟带括号的参数列表。

有各种各样的选择,围绕着每一个都聚集了各种各样的意见。

于 2012-08-11T15:36:00.057 回答