可能重复:
函数前的感叹号有什么作用?
如果您查看KnockoutJS 2.1.0 的源代码,您会看到从第 7 行开始的代码结构如下:
!function(factory) { ... }(factoryDefinition);
not 运算符导致此表达式的计算结果为true
而不是undefined
,但为什么要麻烦呢?
可能重复:
函数前的感叹号有什么作用?
如果您查看KnockoutJS 2.1.0 的源代码,您会看到从第 7 行开始的代码结构如下:
!function(factory) { ... }(factoryDefinition);
not 运算符导致此表达式的计算结果为true
而不是undefined
,但为什么要麻烦呢?
这是形成立即执行的函数表达式的简洁方式。
传统上,人们使用这两种形式
(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use
如果您尝试仅使用
function(){ }(); // Syntax error
这将是一个语法错误,因为它被解释为函数声明而不是表达式。这就是为什么您需要将函数包装在括号中的原因。
但是如果你在函数声明之前放置一个一元运算符,你就不必添加一个括号,它会砍掉代码的一个字符,这是一个(非常)微小的性能优势。有几个一元运算符可用于同一目的
!function(){ }();
~function(){ }();
-function(){ }();
+function(){ }();
因为如果你不做某事,那么它看起来像一个语法错误:
function(factory) { ... }(factoryDefinition);
试试看。
有必要让解析器到达它期望表达式的位置,以便function
在该上下文中识别关键字。否则,当解析器看到function
语句中的第一个标记时,它需要一个简单的函数声明,并且后面不能跟带括号的参数列表。
有各种各样的选择,围绕着每一个都聚集了各种各样的意见。