4 回答

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

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

TA貢獻1858條經(jīng)驗 獲得超8個贊
它返回語句是否可以計算為false。例如:
!false // true
!true // false
!isValid() // is not valid
您可以使用它兩次將值強制為布爾值:
!!1 // true
!!0 // false
所以,更直接地回答你的問題:
var myVar = !function(){ return false; }(); // myVar contains true
編輯:它具有將函數(shù)聲明更改為函數(shù)表達式的副作用。例如,以下代碼無效,因為它被解釋為缺少必需標識符(或函數(shù)名稱)的函數(shù)聲明:
function () { return false; }(); // syntax error

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