可能重复:
函数前的感叹号有什么作用?
我正在查看 Twitter Bootstrap JavaScript 代码,我注意到他们所有的插件都包含在否定自调用函数中。
我知道function ($) { ... }(window.jQuery);
立即调用该函数。
但这是!
为了什么?
可能重复:
函数前的感叹号有什么作用?
我正在查看 Twitter Bootstrap JavaScript 代码,我注意到他们所有的插件都包含在否定自调用函数中。
我知道function ($) { ... }(window.jQuery);
立即调用该函数。
但这是!
为了什么?
1)如果你这样做:
function () { /* ... */ }();
你会得到一个错误。
JS 不允许你触发函数声明(因为“变量提升”的概念,这在技术上不正确,但对很多人来说更容易思考)。
如果您使用声明性函数:
function myFunc () { /* ... */ }
JS 引擎将在您所在的范围内创建它们,然后再创建范围的变量——即使变量都在顶部而函数都在底部。
所以当你写:
function myFunc () { /* ... */ }();
那里有一个错误,因为在当前范围内甚至不存在的 var 可能会在内部被调用,这是有保证的崩溃。
更进一步,如果你不给你的函数声明一个名字:
function () { /* ... */ }
...那么无论如何都会出现错误,因为您还不能调用该函数,但是您无法获取它,因为它没有名称,并且您没有将其分配给变量.
像()
or +
or之类的操作符!
——任何会迫使引擎评估接下来会发生什么的东西,都将允许你触发如下函数:
+function () { /* ... */ }();
只要没有变量监听返回语句,就可以了。
2) 另外,在 的情况下!function () { /*...*/ }();
,如果该函数自然没有 return 语句,那么它将 return undefined
。
相反的undefined
是true
当以这种方式被胁迫时......
...因此,如果您真的非常想要,您可以执行以下操作:
var success = !function () { /* ... */ }();
if (success) { doStuff(); }