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
,第二个+
将两个结果相加。
!
是一种普通的逻辑否定。
()
执行该功能。