否則它將報(bào)告一個錯誤。因?yàn)镴S引擎會把這里的函數(shù)當(dāng)作函數(shù)聲明,函數(shù)聲明不允許沒有函數(shù)名,所以會向匿名函數(shù)報(bào)告錯誤。匿名函數(shù)只能以表達(dá)式的形式存在。例如,這里的匿名函數(shù)是一個表達(dá)式,作為setTimeout的參數(shù),這是允許的?;蛘撸簩⒁粋€匿名函數(shù)賦給一個變量,該變量是一個VAR語句,在該語句中匿名函數(shù)充當(dāng)函數(shù)表達(dá)式。如果函數(shù)有名字呢?不會報(bào)告錯誤,但語義會更改。例如,控制臺將輸出“1”。原因是JS引擎會認(rèn)為前面的函數(shù)是一個函數(shù)聲明的語句,而下面的(1)是一個單獨(dú)的語句,所以它會在控制臺上執(zhí)行下面的語句并輸出1。它實(shí)際上相當(dāng)于:JS圓括號有幾個不同的函數(shù),其中之一是表示表達(dá)式,而不是圓括號中的語句。在本例中,第一對括號告訴JS引擎匿名函數(shù)是函數(shù)表達(dá)式,而不是函數(shù)聲明語句。因此,添加此括號后,不會報(bào)告錯誤。為了實(shí)現(xiàn)“告訴JS引擎這個匿名函數(shù)是一個表達(dá)式”的目的,還有其他幾種編寫方法。你可以把第一對圓括號放在外面。例如,在匿名函數(shù)前面添加一元運(yùn)算符。其他答案也提到了這一點(diǎn):等等。
大括號中可以有括號和圓括號。括號中可以有括號。它們不能顛倒,所以不能加在括號里