在自调用函数中,我们经常看到诸如 (function () {})() 或者 (function(){}()) 的写法,那外层的这个圆括号()是否可以去掉呢?答案是不可以的。
1. 命名函数的定义和调用:
// 函数声明
function test() {
console.log('function');
}
// 函数调用
test();
2. 匿名函数的自调用:
// 写法一
(function () {
console.log('function')
})();
// 写法二
(function () {
console.log('function');
}());
// 写法三
void function() {
console.log('function');
}()
自调用函数外层的这个()是不可以省略的,这是由于JavaScript的表达式的解析问题:
(1)如果省略了外层的括号,则JavaScript无法解析为一个函数表达式的自调用;而是解析为一个函数的声明和一个圆括号,并显示语法错误——圆括号内没有有效的表达式。
(2)在执行的时候报错:Unexpected token (;
3. JavaScript运算符优先级
PS: 摘自MDN - 运算符优先级
优先级 |
运算类型 |
关联性 |
运算符 |
20 |
n/a |
( … ) |
|
19 |
从左到右 |
… . … |
|
从左到右 |
… [ … ] |
||
new (带参数列表) |
n/a |
new … ( … ) |
|
从左到右 |
… ( … ) |
||
18 |
new (无参数列表) |
从右到左 |
new … |
17 |
后置递增(运算符在后) |
n/a |
… ++ |
后置递减(运算符在后) |
… -- |
||
16 |
从右到左 |
! … |
|
~ … |
|||
+ … |
|||
- … |
|||
++ … |
|||
-- … |
|||
typeof … |
|||
void … |
|||
delete … |
|||
await … |
|||
15 |
从右到左 |
… ** … |
|
14 |
从左到右 |
… * … |
|
… / … |
|||
… % … |
|||
13 |
从左到右 |
… + … |
|
… - … |
|||
12 |
从左到右 |
… << … |
|
… >> … |
|||
… >>> … |
|||
11 |
从左到右 |
… < … |
|
… <= … |
|||
… > … |
|||
… >= … |
|||
… in … |
|||
… instanceof … |
|||
10 |
从左到右 |
… == … |
|
… != … |
|||
… === … |
|||
… !== … |
|||
9 |
从左到右 |
… & … |
|
8 |
从左到右 |
… ^ … |
|
7 |
从左到右 |
… | … |
|
6 |
从左到右 |
… && … |
|
5 |
从左到右 |
… || … |
|
4 |
从右到左 |
… ? … : … |
|
3 |
从右到左 |
… = … |
|
… += … |
|||
… -= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
2 |
从右到左 |
yield … |
|
yield* … |
|||
1 |
n/a |
... … |
|
0 |
从左到右 |
… , … |