function(){}()如何工作?
这个问题在这里已经有了答案:
什么! 不
当你使用! 该函数成为一元(逻辑)NOT运算符的单个操作数。
这迫使函数被评估为一个表达式,这可以立即以内联方式调用它。
其他选择
你可以用几乎所有的操作员来做到这一点。 这里有些例子...
'invoke',function(){ /*code*/ }();
1+function(){ /*code*/ }();
void function(){ /*code*/ }();
~function(){ /*code*/ }();
+function(){ /*code*/ }();
关于其中一些的好处是运营商的意义不会超载。
()的问题
当你在函数中使用() ,你可以点击一些错误,如果你在一行中有多个分号,而没有用分号分隔它们,那么会出现一些错误。
(function() {
alert('first');
}())
(function() {
alert('second');
}())
// TypeError: undefined is not a function
这将导致TypeError ,因为围绕第二个函数的outer ()将被解释为打算调用一个函数。 第一个不会返回一个函数,所以你试图调用undefined 。
如何使用不同的操作员来应对(或避免)问题
即使像+这样的运算符在某种程度上超载也不会导致错误。
如果你这样做......
+function() {
alert('first');
}()
+function() {
alert('second');
}()
第一个+被解释为一元+运算符,并且它转换从第一个函数返回的结果,在这种情况下,这个结果是undefined因此它被转换为NaN 。
第二个+将被解释为加法运算符,因此会尝试将NaN添加到第二个函数的返回结果中,这里又是undefined 。
当然结果是NaN ,但它是无害的。 没有非法代码可以引发错误。
演示操作员如何与功能交互
为了证明这一点,只需给每个函数一个返回值,然后将其粘贴到控制台中...
+function() {
alert('first');
return "10";
}()
+function() {
alert('second');
return 20;
}()
// 30
您将得到两个alert ,然后控制台将显示30因为第一个+运算符将字符串"10"转换为数字10 ,第二个+将两个结果相加。
! 是一种普通的逻辑否定。
()执行该功能。
