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

Cgo*_*LEY 25 javascript iife

可能重复:
感叹号在功能之前做了什么?

如果你看一下KnockoutJS 2.1.0源代码,你会在第7行看到这样的代码结构:

!function(factory) { ... }(factoryDefinition);
Run Code Online (Sandbox Code Playgroud)

not运算符导致此表达式计算true而不是undefined,但为什么要打扰?

Pet*_*son 49

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

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

(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use
Run Code Online (Sandbox Code Playgroud)

如果你试图使用

function(){ }(); // Syntax error
Run Code Online (Sandbox Code Playgroud)

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

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

!function(){ }();
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 
Run Code Online (Sandbox Code Playgroud)