关于javascript:否定自调用函数? !function ($) { … }(window.jQuery);

negating self invoking function? !function ($) { … }(window.jQuery);

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

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

我在查看Twitter引导程序的javascript代码,发现他们所有的插件都被封装在否定自调用函数中。

我知道function ($) { ... }(window.jQuery);会立即调用函数。

但是,!的目的是什么?


1)如果您只是这样做:

1
function () { /* ... */ }();

你会得到一个错误。JS不允许您触发一个函数声明(因为"变量提升"的概念,这在技术上是不正确的,但是对于很多人来说更容易思考)。如果使用声明函数:

1
function myFunc () { /* ... */ }

JS引擎将在您所在的范围内创建它们,然后再创建范围的变量——即使变量都在顶部,函数都在底部。

所以当你写:

1
function myFunc () { /* ... */ }();

这里有一个错误,因为当前作用域中甚至不存在的var可能在内部调用,这是一个保证崩溃的过程。

为了进一步说明这一点,如果不给函数声明命名:

1
function () { /* ... */ }

…不管怎么说,这里有一个错误,因为你还不能调用函数,但是你无法获取它,因为它没有名称,而且你没有将它赋给变量。

()+!这样的操作员——任何迫使发动机评估接下来发生的情况的操作,都将允许您启动以下功能:

1
+function () { /* ... */ }();

只要没有变量在监听返回语句,就可以了。

2)另外,在!function () { /*...*/ }();的情况下,如果该函数自然没有返回语句,则返回undefined。与undefined相反的是true,当以这种方式强制时…

…所以如果你真的,真的想要,你可以做如下的事情:

1
2
var success = !function () { /* ... */ }();
if (success) { doStuff(); }