1. 程式人生 > >JavaScript自呼叫函式的外層()的問題

JavaScript自呼叫函式的外層()的問題

在自呼叫函式中,我們經常看到諸如 (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

typeof …

void

void …

delete

delete …

await

await …

15

從右到左

… ** …

14

乘法

從左到右
 

… * …

除法

… / …

取模

… % …

13

加法

從左到右
 

… + …

減法

… - …

12

按位左移

從左到右

… << …

按位右移

… >> …

無符號右移

… >>> …

11

小於

從左到右

… < …

小於等於

… <= …

大於

… > …

大於等於

… >= …

in

… in …

instanceof

… instanceof …

10

等號

從左到右
 

… == …

非等號

… != …

全等號

… === …

非全等號

… !== …

9

按位與

從左到右

… & …

8

按位異或

從左到右

… ^ …

7

按位或

從左到右

… | …

6

邏輯與

從左到右

… && …

5

邏輯或

從左到右

… || …

4

條件運算子

從右到左

… ? … : …

3

賦值

從右到左

… = …

… += …

… -= …

… *= …

… /= …

… %= …

… <<= …

… >>= …

… >>>= …

… &= …

… ^= …

… |= …

2

yield

從右到左

yield …

yield*

yield* …

1

展開運算子

n/a

...

0

逗號

從左到右

, …