可能重复:
What does the exclamation mark do before the function?
我正在查看Twitter Bootstrap JavaScript代码,我注意到他们所有的插件都包含在否定自我调用函数中。
我知道function ($) { ... }(window.jQuery);
会立即调用该函数。
但!
是什么?
答案 0 :(得分:5)
1)如果您这样做:
function () { /* ... */ }();
您将收到错误 JS不会允许你发起一个功能声明(因为“变量提升”的概念,这在技术上是不正确的,但对很多人来说更容易思考)。 如果使用声明性函数:
function myFunc () { /* ... */ }
JS引擎将在创建范围变量之前在您所在的范围内创建它们 - 即使vars全部位于顶部且函数全部位于底部。
所以当你写:
function myFunc () { /* ... */ }();
那里有一个错误,因为当前范围内甚至不存在的变量可能会在内部调用,这是一个有保证的崩溃。
为了进一步说明,如果你没有给你的函数声明一个名字:
function () { /* ... */ }
...那么那里有一个错误,无论如何,因为你还不能调用这个函数,但是你无法得到它,因为它没有名字,你没有分配它变量。
()
或+
或!
等操作符 - 任何会强制引擎评估接下来的内容的操作符都会允许您触发以下函数:
+function () { /* ... */ }();
只要没有变量监听return语句,你就可以了。
2)此外,在!function () { /*...*/ }();
的情况下,如果该函数自然没有return语句,那么它将返回undefined
。
当以这种方式强迫时,undefined
的反面是true
......
...所以,如果你真的,真的想要,你可以这样做:
var success = !function () { /* ... */ }();
if (success) { doStuff(); }