Ką paskaito ženklas prieš funkciją?

 !function () {}(); 
1089
21 сент. nustatė Sebastian Otto 21 sept. 2010-09-21 00:21 '10 - 0:21 2010-09-21 00:21
@ 10 atsakymų

„JavaScript 101“ sintaksė Čia yra funkcijų deklaracija:

 function foo() {} 

Atkreipkite dėmesį, kad nėra semikolono: tai tik funkcija „ Skelbimas“ . Norėdami paleisti funkciją, reikia skambinti foo() .

Dabar, kai pridedame tariamai nekenksmingą šauktuką !function foo() {} ji paverčia ją išraiška . Dabar tai yra funkcijos išraiška.

Tik ! neveikia funkcijos, bet dabar galime įdėti () pabaigoje !function foo() {}() , kuri turi didesnį prioritetą nei ! , ir iš karto iškviečia šią funkciją.

Taigi, ką autorius daro, išsaugoti baitą apie funkcijos išraišką; aiškesnis rašymo būdas bus toks:

 (function(){})(); 

Galiausiai ! grąžinimo išraiška yra teisinga. Taip yra dėl to, kad pagal nutylėjimą visi IIFE grįžta undefined , o tai palieka mums undefined , tai true . Ne itin naudinga.

1837 m
13 апр. Neil atsakymas, pateiktas balandžio 13 d 2011-04-13 23:02 '11 prie 11:02 pm 2011-04-13 23:02

Funkcija:

 function () {} 

negrąžina nieko (arba neapibrėžta).

Kartais mes norime sukurti funkciją dešinėje, kai ją sukuriame. Gali būti, kad bandysite išbandyti šiuos veiksmus:

 function () {}() 
border=0

bet tai sukelia SyntaxError .

Naudojant operatorių ! Prieš tai, kai funkcija tampa traktuojama kaip išraiška, galime jį pavadinti:

 !function () {}() 

Tai taip pat grąžina loginę vertę, kuri yra priešinga funkcijos grąžinimo vertei, šiuo atveju true , nes !undefined yra true . Jei norite, kad faktinė grąžinimo vertė būtų skambučio rezultatas, pabandykite tai padaryti:

 (function () {})() 
346
21 сент. Michael Burr atsakymas rugsėjo 21 d 2010-09-21 00:28 '10 - 0:28 2010-09-21 00:28

Yra geras taškas naudoti ! skambinti funkcijai, pažymėtai „ airbnb javascript“ vadove

Apskritai, idėja naudoti šį metodą atskirose rinkmenose (dar vadinamuose moduliais), kurie vėliau susieti. Įspėjimas čia yra tas, kad failai turėtų būti sujungti su įrankiais, kurie naują failą įdeda į naują eilutę (kuri vis tiek yra normali daugumai įrankių). Tokiu atveju naudokite ! padės išvengti klaidos, jei anksčiau susietas modulis praleido tašką su kableliu, tačiau jis suteiks lankstumo juos įdėti į bet kokią tvarką, nerimaudamas.

 !function abc(){}() !function bca(){}(); 

Veiks taip pat kaip ir

 !function abc(){}() ;(function bca(){})(); 

bet išsaugo du simbolius ir atrodo geriau.

Beje, bet kuris iš + , - , ~ , void operatorių turi tą patį poveikį, kalbant apie skambinančią funkciją, jei naudosite kažką grįžti iš šios funkcijos, jie veiks kitaip.

 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? 

bet jei naudojate IIFE šablonus vienam failui, atskirkite modulio kodą ir naudokite „concat“ įrankį, kad optimizuotumėte (o tai sudaro vienos eilutės vienos eilutės užduotį) nei statyba

 !function abc() {}() +function bca() {}() 

Atlieka saugų kodą, kaip ir pirmojo kodo pavyzdyje.

Tai sukels „JavaScript“ klaidą. ASI negalės atlikti savo darbo.

 !function abc() {}() (function bca() {})() 

Viena pastaba yra susijusi su unariniais operatoriais, jie atliks tą patį darbą, bet tik jei jie nebus naudojami pirmame modulyje. Todėl jie nėra tokie saugūs, jei neturite visiškos kontrolės dėl susietumo tvarkos.

Jis veikia:

 !function abc() {}() ^function bca() {}() 

Tai nėra:

 ^function abc() {}() !function bca() {}() 
51
01 окт. atsakymas pateikiamas dmi3y 01 okt. 2013-10-01 21:10 '13, 9:10 pm 2013-10-01 21:10

Grąžina, ar operatorius gali įvertinti klaidingą. pavyzdžiui:

 !false // true !true // false !isValid() // is not valid 

Ją galite naudoti du kartus, kad priverstumėte loginę vertę:

 !!1 // true !!0 // false 

Taigi, norėdami tiksliau atsakyti į jūsų klausimą:

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

Redaguoti: tai turi šalutinį poveikį funkcijų deklaracijos keitimui į funkcijų išraišką. Pavyzdžiui. Šis kodas negalioja, nes jis aiškinamas kaip funkcijų deklaracija, kurioje trūksta reikalingo identifikatoriaus (arba funkcijos pavadinimo):

 function () { return false; }(); // syntax error 
28
21 сент. atsakymą pateikė gilly3 21 sep . 2010-09-21 00:25 '10 - 0:25 2010-09-21 00:25

Tik išsaugoti duomenų baitą, kai miniaturizuojate „JavaScript“.

laikykite anoniminę funkciją žemiau

 function (){} 

Norint padaryti pirmiau minėtą savarankišką funkciją, mes paprastai pakeisime pirmiau nurodytą kodą kaip

 (function (){}()) 

Dabar pridėjome du papildomus simbolius (,) , papildant () funkciją, reikalingą funkcijai skambinti. Minimalizavimo procese paprastai sutelkiame dėmesį į failo dydžio sumažinimą. Taigi, taip pat galime rašyti aukščiau nurodytą funkciją kaip

 !function (){}() 

Tačiau abi yra savarankiškos funkcijos, ir mes taip pat išsaugome baitus. Vietoj dviejų simbolių (,) naudojome tik vieną simbolį !

5
05 сент. atsakymas pateikiamas Varatharaj 05 sep . 2017-09-05 13:05 '17, 13:05 pm 2017-09-05 13:05

Piktograma sukelia bet kokią funkciją, kuri visada grąžina loginę vertę. Galutinė vertė yra funkcijos, kurią grąžina funkcija, neigimas.

 !function bool() { return false; }() // true !function bool() { return true; }() // false 

Praleisti ! aukščiau pateiktuose pavyzdžiuose bus sintaksėError.

 function bool() { return true; }() // SyntaxError 

Tačiau geriausias būdas tai pasiekti yra:

 (function bool() { return true; })() // true 
5
06 мая '13 в 17:49 2013-05-06 17:49 atsakymas duotas oozzal 06 gegužės 13 d. 17:49 2013-05-06 17:49

! yra logiškas NE operatorius, tai yra logiškas operatorius, kuris kažką pavers į priešingą pusę.

Nors jūs galite apeiti uždarąsias funkcijas, kurias skambinate BANG (!) Prieš funkciją, jis vis tiek apverčia grįžimą, kuris gali būti ne tas, ko norėjote. Kaip ir IEFE atveju, jis grąžina neapibrėžtą, kuris, apverčiant, tampa tikra logine verte.

Vietoj to naudokite uždarymo laikiklį ir BANG ( ! ), Jei reikia.

 // I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what happening. (function(){ return false; }()); => false !(function(){ return false; }()); => true !!(function(){ return false; }()); => false !!!(function(){ return false; }()); => true 

Kiti operatoriai, kurie dirba ...

 +(function(){ return false; }()); => 0 -(function(){ return false; }()); => -0 ~(function(){ return false; }()); => -1 

Kombinuoti operatoriai ...

 +!(function(){ return false; }()); => 1 -!(function(){ return false; }()); => -1 !+(function(){ return false; }()); => true !-(function(){ return false; }()); => true ~!(function(){ return false; }()); => -2 ~!!(function(){ return false; }()); => -1 +~(function(){ return false; }()); +> -1 
5
31 июля '15 в 19:36 2015-07-31 19:36 atsakymą pateikė „ SoEzPz “ liepos 15 d. 15 val. 1936 m

Kitas būdas rašyti IIFE (tiesioginės funkcijos išraiška).

Kitas rašymo būdas yra

 (function( args ) {})() 

tas pats kaip

 !function ( args ) {}(); 
2
06 марта '16 в 12:56 2016-03-06 12:56 atsakymas yra duotas kamal kovo 06 '16, 12:56 2016-03-06 12:56

Leiskite sutaupyti kitų baitų!

 (() => {})() 

pavyzdys:

 (() => {return "yeah"})() 
0
23 июня '18 в 9:24 2018-06-23 09:24 Zibri atsakymą pateikė birželio 23 d. 18 d. 9:24 val. 2018-06-23 09:24

! neigia (priešingai) tai, ko tikitės dėl to, t.y. jei turite

 var boy = true; undefined boy true !boy false 

kai skambinate boy , jūsų rezultatas bus true , bet kai tik pridėsite ! kai skambinate boy , ty !boy , jūsų rezultatas bus false . Kitaip tariant, jūs turėtumėte omenyje NotBoy , bet šį kartą jis iš esmės yra logiškas rezultatas: true arba false .

Tas pats atsitinka su reiškiniu !function () {}(); ir tik function () {}(); nurodys jums klaidą, bet pridėkite ! prieš pat išraiškos function () {}(); daro jį priešinga function () {}(); > kuris turėtų grąžinti jus true . Toliau pateikiamas pavyzdys:

 function () {}(); SyntaxError: function statement requires a name !function () {}(); true 
0
13 янв. Atsakymas pateikiamas antžhrek 13 jan. 2018-01-13 18:55 '18, 18:55 pm 2018-01-13 18:55

Kiti klausimai apie „ etiketes arba „ Užduoti klausimą“