取消自执行函数?!function ($) { ... }(window.jQuery);

4

可能是重复问题:
感叹号在函数前面有什么作用?

我正在查看Twitter Bootstrap JavaScript代码,注意到所有的插件都包裹在否定的自执行函数中。

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

但是 ! 是什么意思?


请参见:https://dev59.com/im025IYBdhLWcg3wvIko - c-smile
function ($) { ... }(window.jQuery); 这个并不会立刻调用函数。它会引起语法错误,这就是为什么你需要 ! (或任何运算符,以便将函数解释为表达式的一部分)。 - I Hate Lazy
是的,我忘记考虑到我通常如何用()包装它,现在我知道这与!相同。 - Hailwood
1个回答

7

1)如果你只是这样做:

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

您将会得到一个错误。
由于“变量提升”概念的存在,JS不允许您触发函数声明(虽然这并不是完全正确的术语,但对很多人来说更容易理解)。
如果您使用声明性函数:

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

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

因此,当您编写以下内容时:

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

这里有一个错误,因为当前作用域中甚至不存在的变量可能会被调用,这将导致程序崩溃。

此外,如果您不为函数声明命名:

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

如果你还没有给一个函数命名或者赋值给变量,那么调用该函数会出现错误,因为你无法获取它。使用像()+!这样的运算符将强制引擎评估接下来的内容,从而使你能够像这样调用函数:

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

只要没有变量监听返回语句,那么你就没问题了。
2) 此外,在 !function () { /*...*/ }(); 的情况下,如果该函数自然地没有返回语句,则它将返回 undefined
在这种情况下,当以这种方式强制转换时,undefined 的相反值为 true...
...所以如果你真的、真的想要,你可以做一些像这样的事情:
var success = !function () { /* ... */ }();
if (success) { doStuff(); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接