亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

感嘆號在功能之前做了什么?

感嘆號在功能之前做了什么?

感嘆號在功能之前做了什么?!function () {}();
查看完整描述

4 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

功能:

function () {}

什么都不返回(或未定義)。

有時我們想在創建函數時調用函數。你可能想嘗試這個:

function () {}()

但它導致了一個SyntaxError。

!在函數之前使用運算符會將其視為表達式,因此我們可以調用它:

!function () {}()

這也將返回與函數返回值相反的布爾值,在這種情況下true,因為!undefinedtrue。如果您希望實際返回值是調用的結果,那么嘗試這樣做:

(function () {})()


查看完整回答
反對 回復 2019-05-27
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

使用airbnb JavaScript指南!上標記的函數調用是一個很好的觀點

通常在單獨的文件(也稱為模塊)上使用此技術的想法,后來得到連接。這里需要注意的是,文件應該被工具連接起來,這些工具將新文件放在新行(這對于大多數連接工具來說無論如何都是常見的行為)。在這種情況下,!如果先前連接的模塊錯過了后續分號,則使用將有助于避免錯誤,但這樣可以靈活地將它們置于任何順序而不用擔心。


!function abc(){}();

!function bca(){}();

會像以前一樣工作


!function abc(){}();

(function bca(){})();

但保存兩個字符和任意看起來更好。


順便說一句任何的+,-,~,void運營商有同樣的效果,在調用該函數,這是肯定的方面,如果你有使用的東西從該功能,他們將采取不同的回報。


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工具進行優化(這使得一行一個文件工作),那么構造


!function abc(/*no returns*/) {}()

+function bca() {/*no returns*/}()

將執行安全的代碼,與第一個代碼示例相同。


這個會拋出錯誤導致JavaScript ASI無法完成其工作。


!function abc(/*no returns*/) {}()

(function bca() {/*no returns*/})()

關于一元運算符的一個注意事項,他們會做類似的工作,但僅在以下情況下,他們不會在第一個模塊中使用。因此,如果您無法完全控制連接順序,那么它們就不那么安全了。


這有效:


!function abc(/*no returns*/) {}()

^function bca() {/*no returns*/}()

這不是:


^function abc(/*no returns*/) {}()

!function bca() {/*no returns*/}()


查看完整回答
反對 回復 2019-05-27
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

它返回語句是否可以計算為false。例如:


!false      // true

!true       // false

!isValid()  // is not valid

您可以使用它兩次將值強制為布爾值:


!!1    // true

!!0    // false

所以,更直接地回答你的問題:


var myVar = !function(){ return false; }();  // myVar contains true

編輯:它具有將函數聲明更改為函數表達式的副作用。例如,以下代碼無效,因為它被解釋為缺少必需標識符(或函數名稱)的函數聲明:


function () { return false; }();  // syntax error


查看完整回答
反對 回復 2019-05-27
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

JavaScript語法101.這是一個函數聲明

function foo() {}

請注意,沒有分號:這只是一個函數聲明。您需要一個調用foo()來實際運行該函數。

現在,當我們添加看似無害的感嘆號時:!function foo() {}它將它變成一個表達式。它現在是一個函數表達式

!本身并不能調用該函數,當然,但我們現在可以把()結尾:!function foo() {}()它的優先級高于!并立即調用函數。

所以作者正在做的是為每個函數表達式保存一個字節; 一種更易讀的寫作方式是:

(function(){})();

最后,!使表達式返回true。這是因為在默認情況下所有IIFE回報undefined,這給我們留下了!undefined這是true。不是特別有用。


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 994 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號