4 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
功能:
function () {}
什么都不返回(或未定義)。
有時(shí)我們想在創(chuàng)建函數(shù)時(shí)調(diào)用函數(shù)。你可能想嘗試這個(gè):
function () {}()
但它導(dǎo)致了一個(gè)SyntaxError
。
!
在函數(shù)之前使用運(yùn)算符會(huì)將其視為表達(dá)式,因此我們可以調(diào)用它:
!function () {}()
這也將返回與函數(shù)返回值相反的布爾值,在這種情況下true
,因?yàn)?code>!undefined是true
。如果您希望實(shí)際返回值是調(diào)用的結(jié)果,那么嘗試這樣做:
(function () {})()

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
使用airbnb JavaScript指南!
上標(biāo)記的函數(shù)調(diào)用是一個(gè)很好的觀點(diǎn)
通常在單獨(dú)的文件(也稱為模塊)上使用此技術(shù)的想法,后來(lái)得到連接。這里需要注意的是,文件應(yīng)該被工具連接起來(lái),這些工具將新文件放在新行(這對(duì)于大多數(shù)連接工具來(lái)說(shuō)無(wú)論如何都是常見的行為)。在這種情況下,!如果先前連接的模塊錯(cuò)過(guò)了后續(xù)分號(hào),則使用將有助于避免錯(cuò)誤,但這樣可以靈活地將它們置于任何順序而不用擔(dān)心。
!function abc(){}();
!function bca(){}();
會(huì)像以前一樣工作
!function abc(){}();
(function bca(){})();
但保存兩個(gè)字符和任意看起來(lái)更好。
順便說(shuō)一句任何的+,-,~,void運(yùn)營(yíng)商有同樣的效果,在調(diào)用該函數(shù),這是肯定的方面,如果你有使用的東西從該功能,他們將采取不同的回報(bào)。
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
但是如果你將IIFE模式用于一個(gè)文件,一個(gè)模塊代碼分離并使用concat工具進(jìn)行優(yōu)化(這使得一行一個(gè)文件工作),那么構(gòu)造
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
將執(zhí)行安全的代碼,與第一個(gè)代碼示例相同。
這個(gè)會(huì)拋出錯(cuò)誤導(dǎo)致JavaScript ASI無(wú)法完成其工作。
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
關(guān)于一元運(yùn)算符的一個(gè)注意事項(xiàng),他們會(huì)做類似的工作,但僅在以下情況下,他們不會(huì)在第一個(gè)模塊中使用。因此,如果您無(wú)法完全控制連接順序,那么它們就不那么安全了。
這有效:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
這不是:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
它返回語(yǔ)句是否可以計(jì)算為false。例如:
!false // true
!true // false
!isValid() // is not valid
您可以使用它兩次將值強(qiáng)制為布爾值:
!!1 // true
!!0 // false
所以,更直接地回答你的問(wèn)題:
var myVar = !function(){ return false; }(); // myVar contains true
編輯:它具有將函數(shù)聲明更改為函數(shù)表達(dá)式的副作用。例如,以下代碼無(wú)效,因?yàn)樗唤忉尀槿鄙俦匦铇?biāo)識(shí)符(或函數(shù)名稱)的函數(shù)聲明:
function () { return false; }(); // syntax error

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
JavaScript語(yǔ)法101.這是一個(gè)函數(shù)聲明:
function foo() {}
請(qǐng)注意,沒(méi)有分號(hào):這只是一個(gè)函數(shù)聲明。您需要一個(gè)調(diào)用foo()
來(lái)實(shí)際運(yùn)行該函數(shù)。
現(xiàn)在,當(dāng)我們添加看似無(wú)害的感嘆號(hào)時(shí):!function foo() {}
它將它變成一個(gè)表達(dá)式。它現(xiàn)在是一個(gè)函數(shù)表達(dá)式。
在!
本身并不能調(diào)用該函數(shù),當(dāng)然,但我們現(xiàn)在可以把()
結(jié)尾:!function foo() {}()
它的優(yōu)先級(jí)高于!
并立即調(diào)用函數(shù)。
所以作者正在做的是為每個(gè)函數(shù)表達(dá)式保存一個(gè)字節(jié); 一種更易讀的寫作方式是:
(function(){})();
最后,!
使表達(dá)式返回true。這是因?yàn)樵谀J(rèn)情況下所有IIFE回報(bào)undefined
,這給我們留下了!undefined
這是true
。不是特別有用。
添加回答
舉報(bào)