1)如果你这样做:
function () { /* ... */ }();
你会得到一个错误。
JS 不允许您触发函数声明(因为“变量提升”的概念,这在技术上并不正确,但对很多人来说更容易思考)。
如果您使用声明性函数:
function myFunc () { /* ... */ }
JS 引擎会在创建作用域的变量之前在您所在的作用域中创建它们——即使变量都在顶部而函数都在底部。
所以当你写:
function myFunc () { /* ... */ }();
那里有一个错误,因为当前作用域中还不存在的变量可能会在内部被调用,这肯定会崩溃。
更进一步,如果您不给函数声明命名:
function () { /* ... */ }
...无论如何,那里都会出现错误,因为您还无法调用该函数,但您无法获取它,因为它没有名称,并且您没有将其分配给变量。
运营商喜欢()
or +
or !
-- 任何迫使引擎评估接下来发生的事情的东西,都将允许您触发该函数,例如:
+function () { /* ... */ }();
只要没有变量监听 return 语句,就可以了。
2) 另外,如果!function () { /*...*/ }();
,如果该函数自然没有 return 语句,那么它将返回undefined
.
相反的是undefined
is true
当被这样胁迫的时候……
...所以如果你真的、真的想要,你可以这样做:
var success = !function () { /* ... */ }();
if (success) { doStuff(); }