4

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

我正在查看 Twitter Bootstrap JavaScript 代码,我注意到他们所有的插件都包含在否定自调用函数中。

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

但这是!为了什么?

4

1 回答 1

6

1)如果你这样做:

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

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

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

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

所以当你写:

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

那里有一个错误,因为在当前范围内甚至不存在的 var 可能会在内部被调用,这是有保证的崩溃。

更进一步,如果你不给你的函数声明一个名字:

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

...那么无论如何都会出现错误,因为您还不能调用该函数,但是您无法获取它,因为它没有名称,并且您没有将其分配给变量.

()or +or之类的操作符!——任何会迫使引擎评估接下来会发生什么的东西,都将允许你触发如下函数:

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

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

2) 另外,在 的情况下!function () { /*...*/ }();,如果该函数自然没有 return 语句,那么它将 return undefined
相反的undefinedtrue当以这种方式被胁迫时......

...因此,如果您真的非常想要,您可以执行以下操作:

var success = !function () { /* ... */ }();
if (success) { doStuff(); }
于 2012-11-28T03:54:46.327 回答