关于javascript:为什么在匿名函数调用上使用NOT运算符? (a la Knockout 2.1.0)

Why use NOT operator on anonymous function call? (a la Knockout 2.1.0)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does the exclamation mark do before the function?

如果您查看knockoutJS2.1.0的源代码,您将在第7行看到这样的代码结构:

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

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


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

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

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

如果你只想用

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

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

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

1
2
3
4
!function(){ }();
~function(){ }();
-function(){ }();
+function(){ }();

因为如果不执行任何操作,则看起来像是语法错误:

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

试试看。

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

有各种不同的选择,每种选择都聚集着不同的意见。